用“C”写下面代码的输出是什么?
#include<stdio.h>
void main()
{
char ***p="hello";
printf("%c",++*p++);
}
我不明白为什么(*)间接运算符在这里使用三次。用“C”写下面代码的输出是什么?
当我编译这个程序,然后输出是“j”。 但实际上听到p是指向指向字符数组的指针的指针。 那么为什么我得到的输出为j。 我不明白这背后的逻辑是什么。 请帮我理解这背后的实际逻辑。
而且混乱增加更多的时候我只用一个间接运营商并得到遵守的程序。然后,输出I .means
void main()
{
char *p="hello";
printf("%c",++*p++);
}
首先,它是一个未定义的行为。
其次,它不是一个正确的C(或C++)代码。由于非常量字符指针,它会生成此警告。
3.c: In function 'main':
3.c:5:12: warning: initialization from incompatible pointer type [enabled by default]
char ***p="hello";
^
更好做这种方式:
#include <stdio.h>
int main()
{
const char ***p="hello";
printf("%c",++*p++);
return 0;
}
和关于它打印:程序已请求运行时终止它以一种不寻常的方式。但这是一个未定义的行为 - 您的结果可能会有所不同。
你不理解为什么使用多重间接是因为多重间接在这里没有意义;这只是这个代码中的许多问题之一。
"hello"
是字符串文字,这也是一个数组表达,特别是“的char
6-元件阵列”,这在该上下文中被转换(“衰变”)的指针char
; p
应被声明为
char *p = "hello";
表达++*p++
尝试递增事情p
点(在此情况下,字符h
),和作为副作用前进p
以指向下一个字符。修改字符串文字的行为是undefined;取决于平台,字符串文字可能不可写,并且表达式++*p++
可能会导致访问冲突。
以下是上面的程序,这给预期的结果的修正版本:
#include <stdio.h>
int main(void)
{
char h[] = "hello";
char *p = h;
printf("%c\n", ++*p++);
return 0;
}
而不必p
指向一个字符串的,我们把它指向一个已经初始化为本地缓冲区字符串文字的内容。
先生,我可以知道术语副作用,你用兔子。 – kTiwari 2012-07-23 18:48:20
@krishnaChandra:“副作用”仅仅意味着由于评估表达式而改变了某些东西。例如,假设'y = 0'和'x = 1'。表达式'y = x ++'有两个副作用 - 由于评估表达式而修改了'y'和'x'。 'y'得到值1(增量前的'x'的值),'x'得到值2(增量后的新值)。表达式'++ * p ++'也有两个副作用;指针'p'和它指向的东西都加1。 – 2012-07-23 19:19:32
sir您能否给我提供一些链接,以帮助我了解副作用的细节。 – kTiwari 2012-07-23 19:22:13
该代码没有有意义的输出为C代码。代码简直是无效的。
首先,void main
不是C中main
函数的有效声明。main
必须声明为返回int
。
其次,初始化无效。字符串文字衰减为C中的类型为char *
。类型char *
的值不能用于初始化类型为char ***
的对象。
第三,解除引用一个指针char ***
产生char **
类型的指针值,该值不能printf
-ed与%c
格式说明。
只是想让你知道'void main'不是C:http://stroustrup.com/bs_faq2.html#void-main – chris 2012-07-23 16:49:45
它是未定义的行为。 [任何人都可以解释这些未定义的行为(i = i ++ + ++ i,i = i ++等...)](http://stackoverflow.com/questions/949433/could-anyone-explain-these-undefined-behavior -iiiii等) – pmr 2012-07-23 16:50:27
它看起来像依赖于所有未定义的行为。 – Wug 2012-07-23 16:50:56