在C语言中,逗号运算符 , 连接两个(或更多)表达式,按从左到右的顺序依次计算它们,并返回最后一个表达式的值:
int x = (f(), g()); // 调用f()和g(),x == g()的结果
通常在for循环中使用:
for(int i = 0, j = 10; i < j; ++i, --j) { ... }
何时有用:
潜在的问题:
问题: 以下代码将打印什么?
int a = 1; int b = (a = 2, a + 3); printf("%d ", b);
答案: 输出 "5"。首先为 a=2 赋值,然后表达式 a+3 计算2+3=5,这个值将赋给变量 b。
故事
在一个C项目中,开发者在返回函数时使用了逗号运算符而没有括号:
return x++, y++;预期函数将返回y+1,但实际上return只接受右边表达式的结果,左边的x++是单独计算的。这让用户的代码困惑,因为return的结果并不是预期的。
故事
在一个for循环中,程序员意外地用逗号代替了分号:
for(i=0, i<10, i++) ...程序编译成功,但循环仅运行了一次,因为for条件中的表达式i<10, i++总是返回最后一个表达式的值(i++),而不是循环继续的条件。
故事
在编写宏时,开发者定义了:
#define DO(x, y) x, y int v = DO(f(), g());期待两个函数都能调用,但忘记加括号。结果只调用了f(); g()的值没有赋给v。正确的用法是:
#define DO(x, y) ((x), (y))。