请在此代码中解释运算符的关联性

时间:2012-09-27 14:43:04

标签: c associativity

#include <stdio.h>
int main(void)
{
  char s[] = {'a','b','c','\n','c','\0'};
  char *p;
  p=&s[3];
  printf("%d\t",++*p++);
  printf("%d",*p);
  return 0;
}  
输出:11 99
请解释输出。为什么地址有增量?

3 个答案:

答案 0 :(得分:2)

我看到的唯一可能令人困惑的是

++*p++

Postincrement的优先级高于取消引用运算符,所以完全括号看起来像

++(*(p++))

哪个postincrements p,取消引用p的原始值以获得char,然后预先计算char的值,然后通过以下方式打印新值: printf为整数。

因此,pp指向的内容都会增加。

答案 1 :(得分:0)

您应该查看运算符优先级 表达式++*p++被编译器评估为((*p) + 1),它也有副作用:它增加*pp的值。使用与ASCII兼容的字符集,此指令在标准输出上打印11'\n'+1 == 10+1 == 11)。第二次printf调用会打印s[4]'c')的值。

答案 2 :(得分:0)

C中的

指针只是表示内存位置的整数。 C中的数组始终位于连续的内存块中。所以当你有一个指向数组第三个元素的指针,并从指针中添加1时,它指向第四个元素。

如果您对++*p++感到困惑:这是因为预增量(++p)和后增量(p++)之间存在差异。对于那些讨厌C ++的人来说,有一个简单的绰号:

  

“C ++ - 改变语言,回归旧问题”。

相关问题