int x;printf("%d",(x=5*6,x*2,x+20));

为什么答案是30而我从VC上运行的是50呢

答案30没错,至少在理论上是没错的,而且也不会想到会是50,赋值只会5*6但是实际在观察中出现了问题,可能是编译器的关系,这个就需要再思考了
下面的东西可能会对逗号表达的理解有用
逗号表达式,又称为“顺序求值运算符”。逗号表达式的一般形式为 表达式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个回答  2014-03-19
这题很奇怪啊...根据定义,逗号表达式的返回值是最后一个子表达式的结果值。x 在被赋值之前仅仅进行了 5*6, x*2 两个计算,这两个计算并没有给 x 赋值,所以到达最后一个表达式的时候,x 的值是尚不确定的,x + 20 的结果也因此而无法确定。这道题的结果应该是 x 被分配内存之后内存中本来的值加上20而获得。因为每次分配的内存是随机的,结果应该每次都不一样。本回答被网友采纳
第2个回答  2014-03-19
答案是错误的.这个表达式:(x=5*6,x*2,x+20)是逗号表达式, 逗号表达式的运算方向是从左到右, 返回值是最后那个表达式的值.所以这个表达式等价于:(5*6, 30*2, 30+20)返回30+20

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网