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


int main()
{
  char arr[]  = "geeksforgeeks";
  char *ptr  = arr;
  while(*ptr != '')
      ++*ptr++;
  printf("%s %s", arr, ptr);
  getchar();
  return 0;
}

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

我们有:

++*ptr++

首先,按照您所说应用后缀运算符。但是,根据后缀增量运算符的定义, ptr++计算结果为 ptr 并将ptr增加 1 。表达式的计算结果不是增加的值,而是原始值。

所以*(ptr++)的计算值与*ptr相同,前者只是也增加了ptr。因此,数组中的第一个元素在算法的第一遍中被修改。

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

如果将其替换为:

++*++ptr

你得到

gffltgpshfflt

其中运算符的执行顺序相同;不同之处在于前缀++的工作方式与后缀++不同 - 它的计算结果为增加的值。请注意,这也会弄乱空终止符,因为在检查ptr是否与 0 相等之前会对其进行修改。

最新更新