关于C语言中逗号表达式的运算问题

ruralboy1 2012-10-03 11:17:25
最近在看做些练习(唉,没办法,该死的知识竞赛),发现一些习题很是不解,遂又到论坛发贴求助了。
今天发现了逗号运算,不过好像谭浩强的书上没这种运算。例如(表达式1, 表达式2,表达式3,……表达式n),刚开始我认为最后结果只是最后一个表达式n的值,但现在遇到好几个疑惑了。
1、(a=3*5,a*4,a+5)),为什么输出结果不是65,而是20;有人说,第二个式子的值是60,但没有赋值给第三个表达式。这又是为什么呢?那么如果有多个表达式,那么最后的值等于最后的表达式的值吗?
2、a = (a = (3*5, a*4), a+15); printf("%d\n", a); 这两个语句的输出结果是175(为什么不是75?),而且把括号里的3*5改成4*5后结果也没变,而把括号的里的a*4改成a*5后结果却变成215,也就是说最里边的括号的第一个表达式不起作用,这是为什么?
3、a = ((a = 3*5, a*4), a+15);printf("%d\n", a); 这两个语句的输出结果是30,把a*4改成a*5结果也没变,这我知道。因为(a = 3*5, a*4)就是个简单的赋值语句,执行完后a = 15,再然后a的值就是30了。

上面的第三个问题算不上问题吧,只请各位大神把前面的几个问题的疑惑解答就好了,谢谢。
...全文
298 点赞 收藏 13
写回复
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangxy10 2012-10-04
[Quote=引用 2 楼 的回复:]

引用 1 楼 的回复:

1、(a=3*5,a*4,a+5)),为什么输出结果不是65,而是20;有人说,第二个式子的值是60,但没有赋值给第三个表达式。这又是为什么呢?那么如果有多个表达式,那么最后的值等于最后的表达式的值吗?
第二个式子不是复制表达式,没有改变a的值,只是计算出了60,但是没有用它。
如果是(a=3*5,a=a*4,a+5))就是65了。

2、a = (a =……
[/Quote]

你可以贴全代码吗?
a的初始值不同,运行结果是不一样的。
最好贴全部的代码才好解释。
回复
AnYidan 2012-10-04
逗号操作符的结合率从左到右
a=3*5,a*4,a+5--> a = 15 -->a*5 = 15 * 4 = 60 扔掉 --> a + 5 = 15 + 5 = 20, 此值被返回作为整个表达式的值

2),3)如果 a 没有初值根本就是错的
回复
ruralboy1 2012-10-04
[Quote=引用 4 楼 的回复:]

第二个问题
int a = 0;
a = (a = (3*5, a*4), a+15);//a = (a=15,a*4,a+15);
printf("%d\n", a);

我运行的结果是15

我的分析是这样的(3*5,a*4) 这个空号里面运算的结果是0

a = (a = 0, a+15);

a = a + 15;

a = 15
[/Quote]

#include<stdio.h>

int main()
{
int a;
a = (a = (3*5, a*4), a+15);
printf("%d\n", a);
}
这是代码,输出结果是175,而不是15
回复
ruralboy1 2012-10-04
[Quote=引用 3 楼 的回复:]

引用 2 楼 的回复:

引用 1 楼 的回复:

1、(a=3*5,a*4,a+5)),为什么输出结果不是65,而是20;有人说,第二个式子的值是60,但没有赋值给第三个表达式。这又是为什么呢?那么如果有多个表达式,那么最后的值等于最后的表达式的值吗?
第二个式子不是复制表达式,没有改变a的值,只是计算出了60,但是没有用它。
如果是(a=3*5,a=a*4,a+5))就是65……
[/Quote]
#include<stdio.h>

int main()
{
int a;
a = (a = (3*5, a*4), a+15);
printf("%d\n", a);
}
输出结果是175,呃,我的编译器是CodeBblocks
回复
椭椭圆圆 2012-10-04
第二个问题
int a = 0;
a = (a = (3*5, a*4), a+15);//a = (a=15,a*4,a+15);
printf("%d\n", a);

我运行的结果是15

我的分析是这样的(3*5,a*4) 这个空号里面运算的结果是0

a = (a = 0, a+15);

a = a + 15;

a = 15
回复
ruralboy1 2012-10-04
[Quote=引用 4 楼 的回复:]
第二个问题
int a = 0;
a = (a = (3*5, a*4), a+15);//a = (a=15,a*4,a+15);
printf("%d\n", a);

我运行的结果是15

我的分析是这样的(3*5,a*4) 这个空号里面运算的结果是0

a = (a = 0, a+15);

a = a + 15;

a = 15
[/Quote]

嗯,对a 初始化后的结果是15,谢了
回复
ruralboy1 2012-10-04
[Quote=引用 9 楼 的回复:]

引用 7 楼 的回复:

逗号操作符的结合率从左到右
a=3*5,a*4,a+5--> a = 15 -->a*5 = 15 * 4 = 60 扔掉 --> a + 5 = 15 + 5 = 20, 此值被返回作为整个表达式的值

2),3)如果 a 没有初值根本就是错的

++

第二个没有初始值是,我用的GCC编译器,没有初始化会出现错误,如果int a=0;的话,运行结……
[/Quote]

还真是唉,令a = 0后,结果就是15了
回复
suixinpiaodang 2012-10-04
逗号运算符结合型是自左往右,一直运算表达式是最后一个算式的值。另外在声明局部变量的时候一定要先进行初始化,不然结果会出乎你的意料。也可以声明成static int i;
回复
idy 2012-10-04
[Quote=引用 6 楼 的回复:]

引用 4 楼 的回复:

第二个问题
int a = 0;
a = (a = (3*5, a*4), a+15);//a = (a=15,a*4,a+15);
printf("%d\n", a);

我运行的结果是15

我的分析是这样的(3*5,a*4) 这个空号里面运算的结果是0

a = (a = 0, a+15);

a = a + 15;

a = 15……
[/Quote]

第二题的结果依赖于a最开始的值。
C语言的所有操作(符)都会产生一个结果,而产生的结果又允许不使用(所以我们可以写这样的语句:a+b;)
比如:
a = (b, c, d, e);
会依次执行 b, c, d, e,然后将e的值赋值给a(这里的b,c,d,e可以用任何表达式代替)

回复
suixinpiaodang 2012-10-04
[Quote=引用 7 楼 的回复:]

逗号操作符的结合率从左到右
a=3*5,a*4,a+5--> a = 15 -->a*5 = 15 * 4 = 60 扔掉 --> a + 5 = 15 + 5 = 20, 此值被返回作为整个表达式的值

2),3)如果 a 没有初值根本就是错的
[/Quote]
++

第二个没有初始值是,我用的GCC编译器,没有初始化会出现错误,如果int a=0;的话,运行结果会是15
回复
魔笛手 2012-10-04
逗号运算就是拿括号最左边的作为运算结果。楼主又不给完整的题目真的是做不了,好像第一题,如果是问a最后是等于几还是逗号运算完之后然后赋值给一个数呢?这样真的做不了
回复
ruralboy1 2012-10-03
[Quote=引用 1 楼 的回复:]

1、(a=3*5,a*4,a+5)),为什么输出结果不是65,而是20;有人说,第二个式子的值是60,但没有赋值给第三个表达式。这又是为什么呢?那么如果有多个表达式,那么最后的值等于最后的表达式的值吗?
第二个式子不是复制表达式,没有改变a的值,只是计算出了60,但是没有用它。
如果是(a=3*5,a=a*4,a+5))就是65了。

2、a = (a = (3*5, a*4), ……
[/Quote]
第二个问题的输出结果是175,不是75
回复
huangxy10 2012-10-03
1、(a=3*5,a*4,a+5)),为什么输出结果不是65,而是20;有人说,第二个式子的值是60,但没有赋值给第三个表达式。这又是为什么呢?那么如果有多个表达式,那么最后的值等于最后的表达式的值吗?
第二个式子不是复制表达式,没有改变a的值,只是计算出了60,但是没有用它。
如果是(a=3*5,a=a*4,a+5))就是65了。

2、a = (a = (3*5, a*4), a+15); printf("%d\n", a); 这两个语句的输出结果是175(为什么不是75?),而且把括号里的3*5改成4*5后结果也没变,而把括号的里的a*4改成a*5后结果却变成215,也就是说最里边的括号的第一个表达式不起作用,这是为什么?
上面计算出了a=15,那么先看(3*5, a*4),结果是60,a变成60了,之后(a = (3*5, a*4), a+15)这个返回75.
a=75了。

3、a = ((a = 3*5, a*4), a+15);printf("%d\n", a); 这两个语句的输出结果是30,把a*4改成a*5结果也没变,这我知道。因为(a = 3*5, a*4)就是个简单的赋值语句,执行完后a = 15,再然后a的值就是30了。
是的,你说对了。
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告