鱼C论坛

 找回密码
 立即注册
查看: 5080|回复: 17

逗号表达式

[复制链接]
发表于 2013-9-19 14:17:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
小Q截图-20130919141209.png 小Q截图-20130919141526.png
为什么会是这样的结果呢?不应该是y=10,x=6吗?
我换成y=(x=b+b),(b+c);  执行结果是y=8,x=8
是什么原因啊?我的VC出问题了吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-9-19 14:29:33 | 显示全部楼层
那个 换一个编译器试试!!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-19 15:05:29 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-19 15:09:50 | 显示全部楼层
本帖最后由 kensai521 于 2013-9-19 16:07 编辑

5:        int a =2, b = 4, c = 6, x = 0, y = 0;
00401028   mov         dword ptr [ebp-4],2     // a = 2
0040102F   mov         dword ptr [ebp-8],4     // b = 4
00401036   mov         dword ptr [ebp-0Ch],6// c = 6
0040103D   mov         dword ptr [ebp-10h],0// x = 0
00401044   mov         dword ptr [ebp-14h],0// y = 0
6:        y = (x = a+b),(b+c);
0040104B   mov         eax,dword ptr [ebp-4]//  a = 2
0040104E   add         eax,dword ptr [ebp-8] // eax = 2 + 4
00401051   mov         dword ptr [ebp-10h],eax //  x = eax   //(6)
00401054   mov         ecx,dword ptr [ebp-10h]//   x= 6  
00401057   mov         dword ptr [ebp-14h],ecx//  y = x  
------------------------------------------------------------------------------------

5:        int    a =2;
00401028   mov         dword ptr [ebp-4],2
6:        int    b = 4;
0040102F   mov         dword ptr [ebp-8],4
7:        int    c = 6;
00401036   mov         dword ptr [ebp-0Ch],6
8:        int    x = 0;
0040103D   mov         dword ptr [ebp-10h],0
9:        int    y = 0;
00401044   mov         dword ptr [ebp-14h],0
10:       y = (x = a+b);
0040104B   mov         eax,dword ptr [ebp-4]
0040104E   add         eax,dword ptr [ebp-8]
00401051   mov         dword ptr [ebp-10h],eax
00401054   mov         ecx,dword ptr [ebp-10h]
00401057   mov         dword ptr [ebp-14h],ecx
11:      (b+c);

在看看这一个表达式汇编代码都一样!y = (x = a+b),(b+c);

我的理解 错了 见谅 新手!


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-19 15:12:24 | 显示全部楼层
kensai521 发表于 2013-9-19 15:09
5:        int a =2, b = 4, c = 6, x = 0, y = 0;
00401028   mov         dword ptr [ebp-4],2  // a =  ...

不懂啊,什么意思呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-19 15:17:53 | 显示全部楼层
什么意思啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-19 15:19:01 | 显示全部楼层

逗号运算符的使用,我刚学的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-19 15:22:45 | 显示全部楼层
本帖最后由 kensai521 于 2013-9-19 15:24 编辑
小氼儿 发表于 2013-9-19 15:12
不懂啊,什么意思呢


语言表达不好 , 鱼哥汇编你看看就懂了!
简单的说 你理解
int a = 2, b = 4, c = 6 x =0, y = 0;
int a = 2;
int b = 4;
int c = 6;
把这个理解就行了!
然后在把 y = (x = a + b),(b+c) 分开
y = (x = a + b);
b + c;
x = a +b
y = x
= b + c 赋值给谁呢;
不要拽一个问题  看不懂 先看看后面 过两天在来看看这个题!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-19 15:23:09 | 显示全部楼层
本帖最后由 ♂季_末♀ 于 2013-9-19 15:25 编辑

编译器执行同等优先级运算符的时候(比如 +  -  *  /)是从右向左执行的,

当执行到:
        y = (x = a + b),(b + c);

编译器会执行(b+c); 执行结果 = 10;
在执行( x = a + b ); 执行结果 = (x = 2 + 4); 赋值后  y =  x = 6;

当编译器执行完毕后结果为:
        y = ( x = a + b ),( b + c );
        y = x = 6, (10);

于是 printf();执行后结果为y = 6, x = 6;后面表达式的(10);无法printf();打印出

第2断代码分析原理书一样的,
        y = ( x = b + b ),( b + c );
        y = (x = 8 ), (10)
后面表达式的(10);无法printf();打印出
希望可以帮助到你。

评分

参与人数 1鱼币 +5 贡献 +5 收起 理由
kensai521 + 5 + 5 感谢楼主无私奉献!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-19 15:35:02 | 显示全部楼层
♂季_末♀ 发表于 2013-9-19 15:23
编译器执行同等优先级运算符的时候(比如 +  -  *  /)是从右向左执行的,

当执行到:

我是学到逗号运算符,里面给的例子是这个,但是得出的结果跟说的不一样,所以我纠结了……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-19 15:35:55 | 显示全部楼层
kensai521 发表于 2013-9-19 15:22
语言表达不好 , 鱼哥汇编你看看就懂了!
简单的说 你理解
int a = 2, b = 4, c = 6 x =0, y = 0;

是不是这个跟逗号运算符没什么关系啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-19 16:00:14 | 显示全部楼层
本帖最后由 kensai521 于 2013-9-19 16:08 编辑
小氼儿 发表于 2013-9-19 15:35
是不是这个跟逗号运算符没什么关系啊


你先把 ,和;两个搞懂啊!
分号就表示着一个语句的结束;
printf();
逗号是一个数据类型还没定义完还需要定义!
你先测试第一个
x = (a,b),(b,c);
在测试这个
x = (a,b),y = (b,c);
这两个语句你都测试下!
在理解y = (x = a + b),(b + c);
逗号和分号在不理解 看看小甲鱼的基础 或者百度 或者找个基础的书 看看!
上面我反汇编那个你在看看y = (x = a + b),(b + c);
这一个表达式 汇编内容一样吗!

评分

参与人数 1鱼币 +5 贡献 +2 收起 理由
小氼儿 + 5 + 2 非常感谢大神~

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-19 16:20:20 | 显示全部楼层
赋值运算符的优先级比逗号运算符高。

评分

参与人数 1鱼币 +5 贡献 +3 收起 理由
小氼儿 + 5 + 3 一语惊醒梦中人啊~

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-19 16:37:19 | 显示全部楼层
style?b? 发表于 2013-9-19 16:20
赋值运算符的优先级比逗号运算符高。

原来如此啊~~~~太感谢啦~~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-19 16:45:15 | 显示全部楼层
kensai521 发表于 2013-9-19 16:00
你先把 ,和;两个搞懂啊!
分号就表示着一个语句的结束;
printf();

小Q截图-20130919163917.png

我就是在看小甲鱼的视频,里面讲到这里的时候说最后是(b+c)的值赋给y,执行的结果却不是这样,所以就纠结了,现在我知道原因啦,非常感谢你的热心帮助,你真是好人~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-21 19:10:06 | 显示全部楼层
这段老师讲错了吧,y = (x = a + b),(b + c);  (b+c)得出的数根本就不可以付给y的吧,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-22 17:22:09 | 显示全部楼层
♂季_末♀ 发表于 2013-9-19 15:23
编译器执行同等优先级运算符的时候(比如 +  -  *  /)是从右向左执行的,

当执行到:

很遗憾的告诉你 你错了
错了好多好多
编译器执行同等优先级运算符的时候(比如 +  -  *  /)是从右向左执行的

没这回事
C只有 || && , ?: 这四个运算符能确定求值顺序是从左到右 其他的全部不确定
更没有任何一个运算符能 从右向左 求值的

这里是优先级 没弄懂
   y = (x = a + b),(b + c);
赋值运算符= 的优先级比 逗号运算符, 高
赋值运算符= 先和子表达式结合
所以 上面的表达式 完全等效于
( y = (x = a + b) ),(b + c);
所以 x 和 y的结果 一样都是a+b

另外需要特意说明的是
逗号运算符, 求值顺序确定是从右向左
所以 这里 必然是 y = (x = a + b)  先与 b+c 进行求值
不可能b+c先求值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-22 17:22:46 | 显示全部楼层
♂季_末♀ 发表于 2013-9-19 15:23
编译器执行同等优先级运算符的时候(比如 +  -  *  /)是从右向左执行的,

当执行到:

很遗憾的告诉你 你错了
错了好多好多
编译器执行同等优先级运算符的时候(比如 +  -  *  /)是从右向左执行的

没这回事
C只有 || && , ?: 这四个运算符能确定求值顺序是从左到右 其他的全部不确定
更没有任何一个运算符能 从右向左 求值的

这里是优先级 没弄懂
   y = (x = a + b),(b + c);
赋值运算符= 的优先级比 逗号运算符, 高
赋值运算符= 先和子表达式结合
所以 上面的表达式 完全等效于
( y = (x = a + b) ),(b + c);
所以 x 和 y的结果 一样都是a+b

另外需要特意说明的是
逗号运算符, 求值顺序确定是从右向左
所以 这里 必然是 y = (x = a + b)  先与 b+c 进行求值
不可能b+c先求值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-6 15:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表