生活! 发表于 2014-1-13 23:50:57

小甲鱼视频疑问?!

在C语言第二章第5节视频第15分钟左右的视频中,所讲的逗号运算怎么和我编译的不一样?
他是取右边的b+c复制给y.
我的编译器怎么是取最左边的表达式给y?
什么原因?求解答

三足金乌 发表于 2014-1-13 23:54:01

兄弟你注意一下运算符的优先级 就能知道是怎么回事了希望对你有帮助:loveliness::loveliness::loveliness:

生活! 发表于 2014-1-13 23:59:24

那我的答案是y=6,x=6啊??
怎么回事情啊?

戏++ 发表于 2014-1-14 10:44:01

int a=2,b=4,c=6,x,y;
00CD162Emov         dword ptr ,2
00CD1635mov         dword ptr ,4
00CD163Cmov         dword ptr ,6
        y=(x=a+b),(b+c);
00CD1643mov         eax,dword ptr
00CD1646add         eax,dword ptr
00CD1649mov         dword ptr ,eax
00CD164Cmov         ecx,dword ptr
00CD164Fmov         dword ptr ,ecx
        printf("y=%d,x=%d",y,x);
00CD1652mov         esi,esp
00CD1654mov         eax,dword ptr
00CD1657push      eax
00CD1658mov         ecx,dword ptr
00CD165Bpush      ecx
        printf("y=%d,x=%d",y,x);
00CD165Cpush      0CD6910h
00CD1661call      dword ptr ds:
00CD1667add         esp,0Ch
00CD166Acmp         esi,esp
00CD166Ccall      __RTC_CheckEsp (0CD1163h)

        return 0;
00CD1671xor         eax,eax

看了下汇编,好像b+c 编译器没去理会哦
我的是vs2012 ,同学在vc6下去试试看,看下反汇编
编译器理解b+c相当于是个空语句了
也确实是啊,b+c的结果都不需要了,如果编译器编译进去了,那这个发明编译器的人就是有点问题了
只是让cpu做了下b+c然后,啥都没干

生活! 发表于 2014-1-14 11:04:28

那就是说小甲鱼的视频说的不对?

戏++ 发表于 2014-1-14 11:06:17

小甲鱼用的估计是vc6吧,编译器有出入的,vc6的同学大伙看下反汇编

生活! 发表于 2014-1-14 11:07:27

我用的就是6.0的哦!

漩涡鸣人 发表于 2014-1-26 09:34:23

甲鱼兄的视频是将(x=a+b)作为表达式1、(b+c)当做表达式2,所以y最后会等于表达式2的值,而您的编译器直接将y=(x=a+b)当做表达式1的值,所以是表达式1的值了。不过甲鱼兄的视频确实有一点问题,因为按照标准的优先级来说,逗号运算符属于最低优先级,比=还要低,所以进行左边的赋值一般应该是正确的。

生活! 发表于 2014-1-26 09:45:51

那问问甲鱼哥是不是他说错了!!!!

Monkey.Dream 发表于 2014-1-26 09:54:36

支持楼主谢谢分享

kyle 发表于 2014-1-26 10:38:53

拿来看看咯

kyle 发表于 2014-1-26 11:08:21

拿来看看咯

kyle 发表于 2014-1-26 11:11:27

拿来看看咯
页: [1]
查看完整版本: 小甲鱼视频疑问?!