逗号运算符,逗号表达式解析

本文详细解释了C语言中的逗号运算符和逗号表达式,包括其语法、求值过程及常见应用场景,特别关注了其在循环语句中的作用。通过实例分析,深入理解逗号表达式如何串联多个表达式及其对程序执行的影响。

逗号运算符和逗号表达式
2007年04月16日 星期一 21:04

  C语言提供一种特殊的运算符——逗号运算符。用它将两个表达式连接起来。如:

  3+5,6+8

称为逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为

         表达式1,表达式2

逗号表达式的求解过程是:先求解表达式1,再求解表达式2。整个逗号表达式的值是表达式2的值。例如,上面的逗号表达式“3+5,6+8”的值为14。又如,逗号表达式
  a=3*5,a*4
对此表达式的求解,读者可能会有两种不同的理解:一种认为“3*5,a*4” 是一个逗号表达式,先求出此逗号表达式的值, 如果a的原值为3,则逗号表达式的值为12,将12赋给a, 因此最后a的值为12。另一种认为:“a=3*5”是一个赋值表达式”,“a*4”是另一个表达式,二者用逗号相连,构成一个逗号表达式。这两者哪一个对呢?赋值运算符的优先级别高于逗号运算符, 因此应先求解a=3*5(也就是把“a=3*5”作为一个表达式)。经计算和赋值后得到a的值为15,然后求解a*4,得60。整个逗号表达式的值为60。
  一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式,如(a=3*5,a*4),a+5 先计算出a的值等于15,再进行a*4的运算得60(但a值未变,仍为15),再进行a+5得20,即整个表达式的值为20。
  逗号表达式的一般形式可以扩展为

    表达式1,表达式2,表达式3……表达式n

它的值为表达式n的值。

  逗号运算符是所有运算符中级别最低的。因此,下面两个表达式的作用是不同的:

  ① x=(a=3,6*3)
  ② x=a=3,6*a

  第①个是一个赋值表达式,将一个逗号表达式的值赋给x,x的值等于18。第②个是逗号表达式,它包括一个赋值表达式和一个算术表达式,x的值为3。

  其实,逗号表达式无非是把若干个表达式“串联”起来。在许多情况下,使用逗号表达式的目的只是想分别得到各个表达式的值,而并非一定需要得到和使用整个逗号表达式的值,逗号表达式最常用于循环语句(for语句)中.

  请注意并不是任何地方出现的逗号都是作为逗号运算符。例如函数参数也是用逗号来间隔的。如

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

  上一行中的“a,b,c”并不是一个逗号表达式,它是printf函数的3个参数,参数间用逗号间隔。
如果改写为

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

则“(a,b,c)”是一个逗号表达式,它的值等于c的值。括弧内的逗号不是参数间的分隔符而是逗号运算符。括弧中的内容是一个整体,作为printf函数的一个参数。
C语言表达能力强,其中一个重要方面就在于它的表达式类型丰富,运算符功能强,因而c使用灵活,适应性强

 

逗号表达式举例:

 

1. 原源程序是:
#include <stdio.h>
void main()
{
    int i,sum=0;
    for(i=0;i<=100;sum+=i,i++);
    printf("1+2+3+...+100=%d/n",sum);
}
得到的结果是:1+2+3+...+100=5050
问题是我在输入的时候把for语句输错了,变成for(i=0;i<=100,sum+=i;i++);其他的都没变,得到的结果是
1+2+3+...+100=0
为什么是0,想知道程序是怎样执行的。

见解,由: temp2011/04/11 22:51:44TwoFlag
for(表达式 1;表达式 2;表达式 3):各表达式用分号分开,如果表达式 2 的值为真则执行循环体。
现在你把表达式 2 输入为 (i<=100,sum+=i),不意间它成为逗号表达式,就是用逗号把若干式子联接起来的东西。
逗号表达式的值要这样来得到:由左到右依次求各式子的值,逗号表达式作为一个整体,它的值为最后一个式子的值。例如求逗号表达式 (x=1+2,3*x) 的值,先求出第一个式子中 x 为 3,所以第一个式子 (x=1+2) 的值为 3,然后求出求第二个式子 (3*x) 的值为 9。最后,逗号表达式的值就是 9。
现在看看 i=0 和 sum=0 时逗号表达式 (i<=100,sum+=i) 的值。这时第一个式子 (i<=100) 为真,第二个式子 (sum+=i) 求出 sum 为 0,所以第二个式子 (sum+=i) 的值为 0,0 表示假。最后,逗号表达式 (i<=100,sum+=i) 的值就是 假,所以完全没有执行循环。

 


c 语言 for 语句中的条件判断为 ,逗号表达式的疑问???

浏览次数:326次 悬赏分:0   |   解决时间:2010-11-19 11:36   |   提问者:liwei320324
for(point=0;point<=10,TI=1;point++)         //连续发送十位数据
  {
   .............
  .............
   TI=0;
   }
其中的逗号表达怎么理解?当 point>10时,那后面对T赋值1 还会继续吗?

问题补充:

补充下,TI 时单片机51里的发送中断标志位!!是不是应该 TI==1 呢??请各位指教!!

 

最佳答案
这是死循环,只看最后的T1=1。每次都能成功,逗号表达式只看最后一条语句。

【C语言】for语句里面的逗号表达式,怎么算啊?

浏览次数:1045次 悬赏分:20   |   解决时间:2008-11-15 20:24   |   提问者:silver狐狐
int k,j,s; 
for(k=2;k<6;k++,k++) 
{s=1; 
for(j=k;j<6;j++) s+=j; 
} 
printf("%d/n",s); 


输出结果是10 
弄不明白 
怎么算的啊?
最佳答案
这应该是当k=4时的结果,因为要对s赋值,所以k=2是没有用的,然后k=k+2=4,
s=1+4=5;s=5+5=10,所以s=10

### 逗号运算符逗号表达式的作用 在C语言中,逗号运算符(`,`)是一种特殊的顺序求值运算符,它允许将多个表达式串联在一起,按照从左到右的顺序依次求值,并返回最后一个表达式的值作为整个逗号表达式的结果。逗号表达式的一般形式为: ``` 表达式1, 表达式2, ..., 表达式n ``` 整个表达式的值为最后一个表达式(即`表达式n`)的值,其余表达式的值会被计算但被忽略[^1]。 逗号运算符的一个常见用途是在`for`循环中同时操作多个变量。例如,可以同时初始化和更新多个变量: ```c for (int i = 0, j = 10; i < 10; i++, j--) { printf("i = %d, j = %d\n", i, j); } ``` 在上述代码中,`i`和`j`的初始化以及递增/递减操作都通过逗号运算符完成,使得代码更加简洁[^1]。 另一个典型应用是在条件判断语句中使用逗号表达式,例如在`if`语句中执行多个表达式,并以最后一个表达式的结果作为判断依据: ```c int a = 3, b = 4, c = 5; if ((a > b, a > c)) { int max = a; a += 3; int t = a / b; ++c; } ``` 在上述代码中,`a > b`和`a > c`是两个表达式,通过逗号连接后,整个表达式的值为`a > c`的结果。这种结构允许在条件判断中执行多个操作,同时保持逻辑清晰[^2]。 ### 逗号运算符的优先级与结合性 逗号运算符的优先级是所有运算符中最低的,这意味着在复杂的表达式中,逗号运算符的求值会在其他运算符之后进行。此外,逗号运算符具有左结合性,即表达式从左到右依次求值。例如: ```c int x = (1 + 2, 3 + 4, 5 + 6); ``` 在这个表达式中,`1 + 2`和`3 + 4`的值会被计算,但被忽略,最终`x`的值为`5 + 6`的结果,即`11`。这种特性使得逗号运算符非常适合用于需要多个表达式顺序执行但只关心最后一个表达式结果的场景。 ### 逗号运算符逗号分隔符的区别 需要注意的是,逗号在C语言中既可以作为运算符,也可以作为分隔符。例如,在变量声明或函数参数列表中使用的逗号是分隔符,而不是运算符: ```c int a = 1, b = 2, c = 3; // 逗号是分隔符 ``` 而在表达式中使用的逗号才是运算符,用于顺序求值: ```c int x = (a++, b++, c++); // 逗号运算符 ``` 在这种情况下,`a++`和`b++`都会被执行,但只有`c++`的值会被赋给`x`。因此,理解逗号在不同上下文中的作用是正确使用逗号运算符的关键[^2]。 ### 逗号运算符的注意事项 虽然逗号运算符在某些情况下非常有用,但在使用时也需要注意其可能导致的代码可读性下降问题。特别是在复杂的表达式中,过多使用逗号运算符会使代码变得难以理解和维护。此外,由于逗号运算符的优先级最低,因此在涉及其他运算符表达式中,建议使用括号来明确求值顺序,以避免因优先级问题导致的错误。 ```c int result = (a = 5, b = 10, a + b); // result = 15 ``` 在上述代码中,使用括号明确表示了逗号表达式的范围,使得代码更加清晰易懂。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值