“半身不遂”的逗号操作符


逗号 (,),意味着两边是不完整的,它不光能分隔变量、参数,还能作为操作符参与运算。今天就来讲讲逗号操作符。

一、逗号操作符、逗号表达式

逗号操作符的用法就像生活中使用逗号这个标点符号一样,就是拿它来隔开一些东西。用逗号,分隔一系列子表达式,就构成了逗号表达式。
逗号表达式的语法形式如下:

表达式1, 表达式2, ..., 表达式N

表达式1-表达式N可以是任意有效的C语言表达式,哪怕它只是一个字母,比如a, b, c。
当要求整个逗号表达式的值时,其执行过程是从左到右依次计算每个表达式,并将最后一个表达式的结果作为整个逗号表达式的结果(注意这里说的结果不是说某个变量的值,而是整个表达式的返回值)。
也就是说,表达式1, 表达式2, ..., 都会进行计算,但计算后的返回值统统没用,被丢到垃圾桶,只会将最后一个表达式表达式N的值作为整个表达式的结果。这一特点用一种流行病形容就是“半身不遂”。
在这里插入图片描述

二、逗号分隔符

2.1 分隔变量、参数

虽然逗号表达式有参与计算的作用,但实际上一般我们都不用它来计算,而是将其作为分隔符。比如,在C语言中声明多个变量时:

int a, b, c;

再比如,在函数调用时传递多个参数:

printf("%d, %d, %d\n", a, b, c);

2.2 多重赋值

逗号操作符还有一个常见的用法就是多重赋值。比如,你想要同时给多个变量赋值,就可以使用逗号操作符来简化代码:

int a, b, c;
(a = 4, b = 3, c = 8);

这里面虽然逗号分隔的表达式变复杂了,但本质上这里的逗号没有起到参与计算的作用,仅作分隔之用。
这种多重赋值还可用在for循环中,比如,可以用它来同时更新多个循环变量:

for (int i = 0, j = 10; i < 5 && j > 5; i++, j--) {
    printf("i = %d, j = %d\n", i, j);
}

三、逗号运算符

在某些场合下,逗号操作符就能起到运算符的作用了。
例如,在C语言中,表达式a = (b = 3, b + 4)整体是一个赋值表达式,赋值运算符右侧的b = 3, b + 4又是一个逗号表达式。这个逗号表达式的计算过程如下:
①首先计算子表达式b = 3。计算后,b的值为3,b=3这个表达式的值也是3。
②然后计算b + 4。计算后,b的值没变,还是3,b+4这个表达式的值为3+4=7。
③最后将逗号表达式中最后一个子表达式,也就是b + 4的值赋给a,即a = 7。
如果你觉得明白了逗号表达式的算法,那么猜猜看下面的代码会输出什么?

#include<stdio.h>
int main(){
    int a = 1, b = 2, c;
    c = (a++, b + 3, a * b);
    printf("%d\n", c);
    return 0;
}

实际上它输出的结果是4,你猜对了吗?
计算过程如下:
①计算a++,结果:a=2,而a++这个表达式的值是1(因为a++的运算是先返回a的值,然后再++),但这个表达式的返回值没什么用,因为逗号表达式最终结果取决于最后一个表达式。
②计算 b + 3,结果:b=2(b的值没被改变),表达式b+3的返回值为5,这个返回值同样没什么用。
③计算a * b,结果:a=2,b=2,所以表达式 a × b = 2 × 2 = 4 a \times b=2 \times 2=4 a×b=2×2=4。把此结果作为整个逗号表达式的返回值。
如果想改变b的值,可以改为下面的代码:

#include<stdio.h>
int main(){
    int a = 1, b = 2, c;
    c = (a++, b += 3, a * b);
    printf("%d\n", c);
    return 0;
}

这时候b的值会变为5,最终输出c的值为10。
需要注意的是,逗号操作符的优先级是所有操作符中最低的,所以在用逗号表达式进行赋值时,一定不要忘了在外面加上括号,像上面的代码,如果写成c = a++, b += 3, a * b;,那就完全不一样了。
因为逗号的优先级比赋值运算符还低,所以整个表达式变成了一个逗号表达式,这个逗号表达式中有3个子表达式:

  • c = a++
  • b += 3
  • a * b

所以计算过程如下:
①计算c = a++,结果:a=2,而a++这个表达式的值是1,将a++的值赋给c,所以c=1。
②计算b += 3,结果:b=2+3=5,b的值被改变,但这个表达式的返回值没什么用。
③计算a * b,结果:a、b的值没变,a=2,b=5,所以表达式 a × b = 2 × 5 = 10 a \times b=2 \times 5=10 a×b=2×5=10。按照逗号表达式的规则,把此结果作为整个逗号表达式的返回值,但是这个返回值并没有给任何变量赋值,所以没什么用。
因此,最后输出c的值就是第①步运算的结果1。
因为逗号表达式有这样奇葩的功能,有幸荣获难以理解成就奖,故此在实际编程中鲜有应用。建议各位也不要在编程中产生用逗号表达式进行赋值的炫技情结,应对它采取“知而不用”的冷静态度。记住:清晰、易于理解的代码才是好代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

金创想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值