,我编写了一个小程序:
#include <stdio.h> int main(void) { int i = 5; i = (i, ++i, 1) + 1; printf("%d\n", i); return 0; }
输出是2。天哪,我没有看到递减的到来!这里发生了什么?
2
此外,在编译上述代码时,我收到一条警告:
px.c:5:8: 警告:逗号表达式的左操作数无效 [-Wunused-value] i = (i, ++i, 1) + 1; ^
px.c:5:8: 警告:逗号表达式的左操作数无效
[-Wunused-value] i = (i, ++i, 1) + 1; ^
为什么?但可能我的第一个问题的答案会自动回答它。
在表达式(i, ++i, 1)中,使用的逗号是逗号运算符
(i, ++i, 1)
逗号运算符(由 token 表示,)是一个二元运算符,它计算其第一个操作数并丢弃结果,然后计算第二个操作数并返回此值(和类型)。
,
因为它丢弃了它的第一个操作数,所以它通常 只在第一个操作数具有理想的副作用时才有用 。如果第一个操作数的副作用没有发生,那么编译器可能会生成有关表达式无效的警告。
因此,在上面的表达式中,最左边的i将被评估,其值将被丢弃。然后++i将被评估并增加i1 并且表达式的值++i将再次被丢弃, _但副作用i是永久_的。然后1将被评估并且表达式的值将是1。
i
++i
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;
请注意, 上面的表达式完全有效并且不会调用未定义的行为 ,因为在逗号运算符的左右操作数的计算之间存在一个序列点。