c中前缀和后缀的优先级和关联性

时间:2014-12-03 15:59:02

标签: post-increment

int main()
{
  char arr[]  = "geeksforgeeks";
  char *ptr  = arr;

  while(*ptr != '\0')
      ++*ptr++;
  printf("%s %s", arr, ptr);

  getchar();
  return 0;
}

while循环++ptr++中的语句以我不理解的方式表现。应该首先评估后增量,因为它具有高优先级,第一个输出值应该是f(递增e)。但这不会发生。要理解我将语句更改为++*(ptr++),因此它可能会给出我期望的输出(ffltgpshfflt是我预期的输出;但是实际输出hffltgpshfflt)。但是输出仍然不会改变。 ()运算符的优先级高于预增量。但为什么输出没有改变呢?

1 个答案:

答案 0 :(得分:1)

我们有:

++*ptr++

首先,如前所述应用后缀运算符。但是,根据后缀增量运算符的定义, ptr++评估为ptrptr增加1 。表达式不会评估增加的值,而是评估原始值。

因此*(ptr++)评估的值与*ptr相同,前者也会增加ptr。因此,在算法的第一遍中修改了数组中的第一个元素。

括号无关紧要,因为后缀增量已经优先。

如果将其替换为:

++*++ptr

你得到了

gffltgpshfflt

其中运算符的执行顺序相同;不同之处在于前缀++与后缀++的工作方式不同 - 它会计算增加的​​值。请注意,这也会混淆null终止符,因为在检查ptr的相等性之前,0已被修改。