1.在赋值语句中:
多个表达式之间用逗号分隔,则以此计算各个表达式的值,并将最后一个表达式的结果赋值给a
如下:
int a = 0, b = 1;
a = (b++, b + 1); //最终a = 3,b = 2
如果不加括号
int a = 0, b = 1;
a = b++ ,b + 1;
则会被看成两个表达式,把b++的值赋值给a,然后执行b+1(并不会对b的结果进行修改)
如果变量声明时如下
int a = 1,2,3,4;
逗号的优先级低于赋值符号,在此处2,3,4会被编译器视为未定义的变量或符号,大多数情况下会导致编译失败.
加上括号之后则会把4赋值给a(合法)
int a = (1,2,3,4);
2.在for循环语句中:
int arr[i] = {0};
for(int i = 0, j = 10; i < j; i++, j--)
{
arr[i] = i;
}
在此类语句中,逗号可以用来同时执行多个操作
for( ;a <= 9,b <= 5,a <=11; )
以上表达式实际条件为a<=11,前两个表达式会被执行但结果被忽略
3.在函数中使用
int add(int x, int y)
{
return x + y;
}
int main()
{
int a = 1, b = 2, c = 3;
int ret = add((a, b), c);
printf("%d", ret);
}
函数参数分别为(b,c)即(2,3),最终打印5。
4.宏定义中的使用
#define L(x) (printf("Value: %d\n",x),x)
int main()
{
int result = L(42);
printf("%d", result);
}
根据宏定义的使用规则L(42)被替换为(printf("Value: %d\n",42),42)
执行第一个语句时调用了printf函数,并把第二个表达式的结果42(第一个表达式的结果为10,表示printf函数成功打印的字符个数)返回给了result.因此在打印printf的之的时候输出42。