小编典典

i = (i, ++i, 1) + 1 是什么?做?

all

,我编写了一个小程序:

#include <stdio.h>

int main(void) {
  int i = 5;
  i = (i, ++i, 1) + 1;
  printf("%d\n", i);
  return 0;
}

输出是2。天哪,我没有看到递减的到来!这里发生了什么?

此外,在编译上述代码时,我收到一条警告:

px.c:5:8: 警告:逗号表达式的左操作数无效

  [-Wunused-value]   i = (i, ++i, 1) + 1;
                        ^

为什么?但可能我的第一个问题的答案会自动回答它。


阅读 70

收藏
2022-08-24

共1个答案

小编典典

在表达式(i, ++i, 1)中,使用的逗号是逗号运算符

逗号运算符(由 token 表示,)是一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型)。

因为它丢弃了它的第一个操作数,所以它通常 只在第一个操作数具有理想的副作用时才有用
。如果第一个操作数的副作用没有发生,那么编译器可能会生成有关表达式无效的警告。

因此,在上面的表达式中,最左边的i将被评估,其值将被丢弃。然后++i将被评估并增加i1 并且表达式的值++i将再次被丢弃,
_但副作用i是永久_的。然后1将被评估并且表达式的值将是1

它相当于

i;          // Evaluate i and discard its value. This has no effect.
++i;        // Evaluate i and increment it by 1 and discard the value of expression ++i
i = 1 + 1;

请注意, 上面的表达式完全有效并且不会调用未定义的行为
,因为在逗号运算符的左右操作数的计算之间存在一个序列点。

2022-08-24