int main(){
printf("the value is %d \n " ,'x'+ "x");
return 0;
}
输出
4196024
但前一个('x'
)是一个整数,后一个("x"
)是一个字符串。
我可以知道吗?或者它给我一个垃圾值。
答案 0 :(得分:4)
文字字符串的类型为char [N]
,其中N
足够大,可用于文字中的所有字符加上终止'\0'
(即"x"
的类型为char[2]
)。
在表达式'x' + "X"
的上下文中,数组被转换为指向其第一个元素的指针,然后该地址将添加int
值'x'
。生成的地址将传递给printf()
,并且转换规范无效。
您调用了未定义的行为!
试试这个
printf("the valus is %p\n", (void*)('x' + "x"));
另请注意,地址'x' + "x"
不是程序中任何对象的一部分。仅仅评估它已经是未定义的行为。
答案 1 :(得分:2)
基本上,
printf("the value is %d \n " ,'x'+ "x");
调用undefined behaviour。你需要的是%p
格式说明符。
否则,一般
"string"
为您提供字符串文字的基本地址'p'
为您提供char
表示的ASCII值。所以,这里基本上要做的是在字符串'x'
的{{1}}元素中打印成员的地址(这实际上没有多大意义)。
为了更好地理解,您可以将print语句重写为
"x"
相当于
printf("the pointer is %p\n", (void *) ("x"+ 'x'));
请注意,在打印格式的换行符之前或之后,您不需要空格。
答案 2 :(得分:1)
您在格式化字符串中要求的是一个整数,因此它将打印添加到字符串文字'x'
的基址的字符"x"
的整数值。
'x'
为120,因此如果您使用内存查看器查看输出值减去120个字节,您可能会发现'x'
后跟'\0'
(= 0)。