程序人生

御剑乘风来,除魔天地间。有酒乐逍遥,无酒我亦癫。一饮尽江河,再饮吞日月。千杯醉不倒,唯我酒剑仙。

转载 【c】c语言中逗号运算符和逗号表达式收藏

新一篇: 【c】C语言编程写的一个http下载程序 | 旧一篇: 一个程序员如何月进万金的?

 刚开始学习C语言时,对逗号去处符和逗号表达式非常困惑,本文给了我很大的帮助。

来自:百度空间-软件工程师

  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使用灵活,适应性强

发表于 @ 2007年09月10日 20:34:00|评论(loading...)|编辑

新一篇: 【c】C语言编程写的一个http下载程序 | 旧一篇: 一个程序员如何月进万金的?

评论

#wenjie713 发表于2008-05-28 10:27:57  IP: 218.74.121.*
#include<stdio.h>
int main()
{
int a=3;
a=3*5,a*4;
printf("%d",a);
return 0;
}
这个程序我用C-Free为什么运行结果是15??
#greatghoul 发表于2008-05-30 09:30:14  IP: 124.114.149.*
@wenjie713
应该是这样用的。
a=(3*5,a*4);
不加括号相当于这样
(a=3*5,a*4);
自然会是15了。
#woshumao0080 发表于2008-09-05 12:03:30  IP: 202.118.67.*
i=(a=2*3,a*5),a+6;

cout << i << endl;

i=((a=2*3,a*5),a+6);

cout << i << endl;

请问这段程序的结果是什么?
如何解释?
#GreatGhoul 发表于2008-09-05 16:29:20  IP: 124.116.220.*
@ woshumao0080
逗号表达式的用法我就不用解释了吧。自己google下就知道了。

i = (a = 2 * 3, a * 5), a + 6;
从左向右解析
(a = 2 * 3, a * 5)中a = 2 * 3已经是一个独立的表达式了,后面的a a * 5与a的赋值无关所以这一步a = 6
同理i = (a = 2 * 3, a * 5)也是一个独立的表达式,这里i = a * 5 = 6 * 5 = 30;

i = ((a = 2 * 3, a * 5), a + 6);
从左向右解析
由上知,a依然等于6,后面的a * 5依然与a的赋值无关。
i = ((a = 2 * 3, a * 5), a + 6)是一个独立的表达式
而这里(a = 2 * 3, a * 5)作为逗号表达式的左式,自然i就应该等于右式了。这里i = a + 6 = 6 + 6 = 12


综上,输出的结果是
30
12

#woshumao0080 发表于2008-09-07 17:57:33  IP: 202.118.67.*
恩……谢谢,了解了。

看来我看第一个式子的时候,还是想当然地理解成了第二个式子,还是忽略了赋值运算的优先级比逗号要高这件事儿。
#woshumao0080 发表于2008-09-07 17:57:55  IP: 202.118.67.*
恩……谢谢,了解了。

看来我看第一个式子的时候,还是想当然地理解成了第二个式子,还是忽略了赋值运算的优先级比逗号要高这件事儿。
发表评论  


登录
Csdn Blog version 3.1a
Copyright © great_ghoul