字符串常量和字符常量

时间:2015-06-30 09:37:08

标签: c string char printf

int main(){
   printf("the value is %d \n  " ,'x'+ "x");

   return 0;
}

输出

  

4196024

但前一个('x')是一个整数,后一个("x")是一个字符串。

我可以知道吗?或者它给我一个垃圾值。

3 个答案:

答案 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)。

相关问题