int t=1;printf("%d\n",(t+5,t++));为什么输出1? printf("%d\n", scanf("%d", &a)...

作者&投稿:春点 (若有异议请与网页底部的电邮联系)
首先要知道打印出来的是(t+5,t++)这个表达式的值
(t+5,t++)是逗号表达式,都好表达式的值是最后一个式子的值。例如(a,b,c,d),此时的逗号表达式的值就是d。所以(t+5,t++)的值等于t++
因为是后至自加,所以先使用后自加,所以值为1。
所以打印的是1

首先(t+5,t++)这是一个表达式,最后结果应该看最后那个表达式。也就是t++。然后前缀和后缀“++”又是不同的意思。t++意思是整个语句执行完以后再加1,先输出t以后,t再加1.所以输出为1.

(t+5, t++)是逗号表达式,先计算t+5,t的值不变,然后取t的值(此时为1),再将t的值加1,所以t的值不变

vs2005 debug下汇编

void main()
{
00411B90 push ebp
00411B91 mov ebp,esp
00411B93 sub esp,0D0h
00411B99 push ebx
00411B9A push esi
00411B9B push edi
00411B9C lea edi,[ebp-0D0h]
00411BA2 mov ecx,34h
00411BA7 mov eax,0CCCCCCCCh
00411BAC rep stos dword ptr es:[edi]
int t=1;
00411BAE mov dword ptr [t],1
printf("%d\n",(t+5,t++));
00411BB5 mov eax,dword ptr [t]
00411BB8 mov dword ptr [ebp-0D0h],eax // 开辟一个匿名变量来存t初始值
00411BBE mov ecx,dword ptr [t]
00411BC1 add ecx,1
00411BC4 mov dword ptr [t],ecx
00411BC7 mov esi,esp
00411BC9 mov edx,dword ptr [ebp-0D0h] // t 初始值 放入edx
00411BCF push edx // 压入参数
00411BD0 push offset string "%d\n" (417820h)
00411BD5 call dword ptr [__imp__printf (41A464h)]
00411BDB add esp,8
00411BDE cmp esi,esp
00411BE0 call @ILT+460(__RTC_CheckEsp) (4111D1h)
//}
00411BE5 xor eax,eax
00411BE7 pop edi
00411BE8 pop esi
00411BE9 pop ebx
00411BEA add esp,0D0h
00411BF0 cmp ebp,esp
00411BF2 call @ILT+460(__RTC_CheckEsp) (4111D1h)
00411BF7 mov esp,ebp
00411BF9 pop ebp
00411BFA ret
通过上面的汇编可以看出,t+5直接就没有编译,就相当于
int t=1;printf("%d\n",t++);

逗号表达式取右值这个应该是c/c++的准则,回答的更确切吧。

, 运算符使它两边的表达式以从左到右的顺序被执行,并获得右边表达式的值。

表达式的值与值是有区别的!

有一种形式你可能还没有明白过来:
例如
i=5;
i++;
这个表达式的值是5,而i 的值是6,明白吗?

已有声明:“int t=1;”,则执行“printf("%d",(t+5,t++))';”时,输出的结果是什么?~

输出值为1

语句printf("%d",(t+5,t++));
也就是输出表达式t+5,t++的值,逗号表达式的值由最后一项决定,也就是t++
前面的t+5未改变t值,t++,++运算符后缀,先引用后自增
所以输出t原值1,但是t值最后变为2

c语言的标准格式化输入函数scanf("%d", &a)表示从键盘输入一个整数存入变量a的地址空间
并返回正确输入的个数 1
所以printf("%d
", scanf("%d", &a));
==》printf("%d
", 1);
所以输出1