C语言:赋值运算符和逗号运算符

201 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

赋值运算符:+=,-=,*=,/=,%=

C语言有很多赋值运算符。最基本,最常用的是=,它把右侧表达式的值赋给左侧的变量。其他赋值运算符都用于更新变量,其用法都是左侧是一个变量名,右侧是一个表达式。赋给变量的新值是根据右侧表达式的值调整后的值。确切的调整方案取决于具体的运算符。例如:

scores+=20scores=scores+20 相同
dimes-=2dimes=dimes-2 相同
bunnies*=2bunnies=bunnies*2 相同
time/=2.73time=time/2.73 相同
reduce%=3reduce=reduce%3 相同

上述所列的运算符右侧都使用简单的数,还可以使用更复杂的表达式,例如:

x*=3*y+12x=x*(3*y+12) 相同

以上提到的赋值运算符与=的优先级相同,即比+或* 优先级低。上面这个例子也反应了赋值运算符的优先级,3* y先与12相加,再把计算结果与x相乘,最后再把乘积赋给z。

并非一定要使用这些组合形式的赋值运算符。但是,它们让代码更紧凑,而且与一般形式相比,组合形式的赋值运算符生成的机器代码更高效。当需要在for循环中塞进一些复杂的表达式时,这些组合的赋值运算符特别有用。

逗号运算符

逗号运算符拓展了for循环的灵活性,以便在循环头中包含更多的表达式。

举个例子

#include <stdio.h>
int main() {
    const int FIRST_OZ=46;
    const int NEXT_OZ=20;
    int ounces,cost;
    printf("  ounces cost\n");
    for(ounces=1,cost=FIRST_OZ;ounces<=16;ounces++,cost+=NEXT_OZ)
        printf("%5d  $%4.2f\n",ounces,cost/100.0);
    return 0;
}

运算结果

Snipaste_2022-08-20_19-36-13.png

该程序在初始化表达式和更新表达式中使用了逗号运算符。初始化表达式中的逗号使ounces和cost都进行初始化,更新表达式中逗号使每次迭代ounces递增1,cost递增20,绝大多数计算都在for循环头中进行。

逗号运算符有两个其他性质

  • 保证了被分隔的表达式从左往右求值。换句话说,逗号是一个序列点,所以逗号左侧项的所有副作用都在程序执行逗号右侧项之前发生。
  • 整个逗号表达式的值是右侧项的值。
  • 作为序列点的逗号保证了左侧子表达式的副作用在对右侧子表达式求值之前发生。