鱼C论坛

 找回密码
 立即注册
查看: 3399|回复: 16

求解!!!

[复制链接]
发表于 2013-10-31 21:41:58 | 显示全部楼层 |阅读模式
1鱼币
#include<stdio.h>
main()
{
        int a = 10;
        a = ( 3 * 5 , a + 4);
        printf("a = %d n", a);
}
这个程序执行后,结果为a=14是怎么来得?!

最佳答案

查看完整内容

这是逗号表达式 从左向右执行 如果像这样是赋值语句则被赋的就是最右边的 所以a = (3 * 5,a+4); 等价于a = a + 4; 但是其他的也是会执行的 比如a = (b++,a+b);如果b一开始是1a一开始是2则最终a=4不是3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-31 21:41:59 | 显示全部楼层
这是逗号表达式
从左向右执行 如果像这样是赋值语句则被赋的就是最右边的 所以a = (3 * 5,a+4);
等价于a = a + 4;   但是其他的也是会执行的 比如a = (b++,a+b);如果b一开始是1a一开始是2则最终a=4不是3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-10-31 21:57:02 | 显示全部楼层
逗号表达式,从左到右执行,最后表达式表示的值是最后一个值
b,a=1
b=a++,a++,a+3,a;
那么b就是加了两次后的2
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-1 12:28:50 | 显示全部楼层
5:        int a = 10;
00401028   mov         dword ptr [ebp-4],0Ah     ;把10放到这个基址寄存器里面
6:
7:        a = ( 3 * 5, a + 4 );
0040102F   mov         eax,dword ptr [ebp-4]   ;把基址寄存器里面的东西放到eax里面
00401032   add         eax,4                       ;eax 加 4 就等于 14
00401035   mov         dword ptr [ebp-4],eax     ;再把eax里的14放到基址寄存器里面
8:
9:            printf("a = %d\n",a);
00401038   mov         ecx,dword ptr [ebp-4]
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就是这样出来的,亲,懂了吗!  !^&^!


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-1 13:00:10 | 显示全部楼层

额!有点看不懂!3*5是3乘5
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-1 13:03:46 | 显示全部楼层
czr27 发表于 2013-10-31 21:57
逗号表达式,从左到右执行,最后表达式表示的值是最后一个值
b,a=1
b=a++,a++,a+3,a;

那就是说a=a+4,而不等于3*5?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-1 16:19:37 | 显示全部楼层
虽然3*5 运行了,但是他没有将结果付给任何值,所以a还是10,在运行a+4,所以是14
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

头像被屏蔽
发表于 2013-11-1 20:18:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-1 21:17:08 | 显示全部楼层
悬赏给我吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-2 09:00:22 | 显示全部楼层
{:1_1:}  a = ( 3 * 5 , a + 4);   该表达式是以最后一次赋值为准的,这么规定的  所以10+4=15  希望LZ理解
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-2 13:02:48 | 显示全部楼层
逗号表达式返回最后一个表达式的值 标准如此 然后编译器制定规则如此 所以如此
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-2 13:12:59 | 显示全部楼层
Z_belief 发表于 2013-11-1 13:00
额!有点看不懂!3*5是3乘5

哦,这个没关系,如果汇编不懂得话,可以看一下甲鱼大哥的《0基础入门学习汇编语言》和他的《win32汇编》
这样的话,你就能看懂了,也会使你了解到一个程序在计算机的底层是怎么运作的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-2 13:59:00 | 显示全部楼层
逗号表达式。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-2 14:40:56 | 显示全部楼层
4:        int a = 10;
00401028   mov         dword ptr [ebp-4],0Ah
5:        a = ( 3 * a , a + 4);
0040102F   mov         eax,dword ptr [ebp-4]
00401032   add         eax,4
00401035   mov         dword ptr [ebp-4],eax
6:        printf("a = %d\n", a);
00401038   mov         ecx,dword ptr [ebp-4]
0040103B   push        ecx
0040103C   push        offset string "a = %d n" (0042201c)
00401041   call        printf (00401070)
00401046   add         esp,8

我把你的程序改了一下,3*a;结果依然是14.
从这一点就可以证明逗号表达式应该算的是最后一个表达式,之前的都不计数。
至于到底是什么还是看书吧。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-2 15:26:14 | 显示全部楼层
a=(3*5,a+4);
这个语句是把(3*5,a+4)的值赋给a
因为(3*5,a+4)的值为14.
,起到了一个分隔符的作用
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-11-2 15:56:52 | 显示全部楼层
青玄 发表于 2013-11-1 12:28
5:        int a = 10;
00401028   mov         dword ptr [ebp-4],0Ah     ;把10放到这个基址寄存器里面 ...

我很喜欢你的思路,呵呵,用汇编来展示细节,{:2_30:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 08:52

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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