Z_belief 发表于 2013-10-31 21:41:58

求解!!!

#include<stdio.h>
main()
{
      int a = 10;
      a = ( 3 * 5 , a + 4);
      printf("a = %d n", a);
}
这个程序执行后,结果为a=14是怎么来得?!

牡丹花下死做鬼 发表于 2013-10-31 21:41:59

这是逗号表达式
从左向右执行 如果像这样是赋值语句则被赋的就是最右边的 所以a = (3 * 5,a+4);
等价于a = a + 4;   但是其他的也是会执行的 比如a = (b++,a+b);如果b一开始是1a一开始是2则最终a=4不是3

czr27 发表于 2013-10-31 21:57:02

逗号表达式,从左到右执行,最后表达式表示的值是最后一个值
b,a=1
b=a++,a++,a+3,a;
那么b就是加了两次后的2

青玄 发表于 2013-11-1 12:28:50

5:      int a = 10;
00401028   mov         dword ptr ,0Ah   ;把10放到这个基址寄存器里面
6:
7:      a = ( 3 * 5, a + 4 );
0040102F   mov         eax,dword ptr    ;把基址寄存器里面的东西放到eax里面
00401032   add         eax,4                     ;eax 加 4 就等于 14
00401035   mov         dword ptr ,eax   ;再把eax里的14放到基址寄存器里面
8:
9:            printf("a = %d\n",a);
00401038   mov         ecx,dword ptr
0040103B   push      ecx
0040103C   push      offset string "a = %d\n a= %d" (0042201c)
00401041   call      printf (00401080)
00401046   add         esp,8
10:   }
00401049   pop         edi
0040104A   pop         esi
0040104B   pop         ebx

以上是他的汇编代码,不过3*5是什么意思,在汇编代码里面也没出现它的作用啊,或许是我眼拙没看出来,呵呵!^_^!
根据汇编的话,14就是这样出来的,亲,懂了吗!!^&^!


Z_belief 发表于 2013-11-1 13:00:10

青玄 发表于 2013-11-1 12:28 static/image/common/back.gif
5:      int a = 10;
00401028   mov         dword ptr ,0Ah   ;把10放到这个基址寄存器里面 ...

额!有点看不懂!3*5是3乘5

Z_belief 发表于 2013-11-1 13:03:46

czr27 发表于 2013-10-31 21:57 static/image/common/back.gif
逗号表达式,从左到右执行,最后表达式表示的值是最后一个值
b,a=1
b=a++,a++,a+3,a;


那就是说a=a+4,而不等于3*5?

随风听雨雪 发表于 2013-11-1 16:19:37

虽然3*5 运行了,但是他没有将结果付给任何值,所以a还是10,在运行a+4,所以是14

随风听雨雪 发表于 2013-11-1 16:22:05

#include<stdio.h>
main()
{
         int a = 10;
         a = ( a=3 * 5,a+4 );
      printf("a = %d n", a);
}
这样结果为19

大个的糖果 发表于 2013-11-1 20:18:49

ypyangpong 发表于 2013-11-1 21:17:08

悬赏给我吧

乱闯 发表于 2013-11-2 09:00:22

{:1_1:}a = ( 3 * 5 , a + 4);   该表达式是以最后一次赋值为准的,这么规定的所以10+4=15希望LZ理解

翠竹 发表于 2013-11-2 13:02:48

逗号表达式返回最后一个表达式的值 标准如此 然后编译器制定规则如此 所以如此

青玄 发表于 2013-11-2 13:12:59

Z_belief 发表于 2013-11-1 13:00 static/image/common/back.gif
额!有点看不懂!3*5是3乘5

哦,这个没关系,如果汇编不懂得话,可以看一下甲鱼大哥的《0基础入门学习汇编语言》和他的《win32汇编》
这样的话,你就能看懂了,也会使你了解到一个程序在计算机的底层是怎么运作的。

good 发表于 2013-11-2 13:59:00

逗号表达式。。

musilintan 发表于 2013-11-2 14:40:56

4:      int a = 10;
00401028   mov         dword ptr ,0Ah
5:      a = ( 3 * a , a + 4);
0040102F   mov         eax,dword ptr
00401032   add         eax,4
00401035   mov         dword ptr ,eax
6:      printf("a = %d\n", a);
00401038   mov         ecx,dword ptr
0040103B   push      ecx
0040103C   push      offset string "a = %d n" (0042201c)
00401041   call      printf (00401070)
00401046   add         esp,8

我把你的程序改了一下,3*a;结果依然是14.
从这一点就可以证明逗号表达式应该算的是最后一个表达式,之前的都不计数。
至于到底是什么还是看书吧。。。。

殇丶逝 发表于 2013-11-2 15:26:14

a=(3*5,a+4);
这个语句是把(3*5,a+4)的值赋给a
因为(3*5,a+4)的值为14.
,起到了一个分隔符的作用

cainiao367 发表于 2013-11-2 15:56:52

青玄 发表于 2013-11-1 12:28 static/image/common/back.gif
5:      int a = 10;
00401028   mov         dword ptr ,0Ah   ;把10放到这个基址寄存器里面 ...

我很喜欢你的思路,呵呵,用汇编来展示细节,{:2_30:}
页: [1]
查看完整版本: 求解!!!