一个简单的C程序解决思路


一个简单的C程序
include <stdio.h>
main(){
  int i=5,j=5,p,q;
  p=(i++)+(i++)+(i++);
  q=(++j)+(++j)+(++j);
  printf("%d,%d,%d,%d",p,q,i,j);
} q的结果为什么是22,不是21

C++/VC 程序开发 异常处理

lickboy 13 years, 4 months ago


<fieldset> <legend> 探讨 </legend>

q是22么,应该是24吧,先算++j,实际上是3个8相加了吧
</fieldset>


一刀砍死兄贵 answered 13 years, 4 months ago


不同编译器的原因

icekira answered 13 years, 4 months ago


不好意思,前面发错了。vs是24, 如果是21也能理解
22 确实不知道内部是怎么实现的。

; 5 : int p=(++j)+(++j)+(++j);

add DWORD PTR [eax], 3
mov eax, DWORD PTR [eax]
lea eax, DWORD PTR [eax+eax*2]


wer250 answered 13 years, 4 months ago


我的编译器报警告,然后没输出

你将化作光芒 answered 13 years, 4 months ago


vs2008的编译结果
也就是一个语句中的++计算,要到语句结束的时候,才会反映到相应的寄存器。

; 5 : int p=(i++)+(i++)+(i++);

mov ecx, DWORD PTR [edx]
lea eax, DWORD PTR [ecx+ecx*2]
add ecx, 3
mov DWORD PTR [edx], ecx


zerox answered 13 years, 4 months ago


月经贴

大神的裤袜 answered 13 years, 4 months ago


这个就是教学用的c语言

zala小队长 answered 13 years, 4 months ago


让楼主弄得很艹计!我的输出的结果是15.24.8.8(vs2010英文旗舰版)!!!

步兵还是骑兵 answered 13 years, 4 months ago


同意二楼,不同编译器运行效果可能不一样。

shuin answered 13 years, 4 months ago


它应该是这样的,P=((++I)+(++i))+(++I)

sohuren answered 13 years, 4 months ago



int j=4;
int a = i++ + i++;
int b = ++j + ++j;
printf("%d, %d\n", a, b);
问题又来了,i++ + i++是先自增一次,相加,再自增,然后赋值呢,还是先相加赋值然后自增两次呢。另外,++j又将如何表现呢?
结果是:6,12
这下明白了,原来 i++的理解应该是执行完整个表达式的其他操作后,然后才自增,所以例子中的a=3+3=6;而后i再自增2次,i=5;相反,++j是先自增然后再参加其它运算,所以b=6+6=12.
到此,是否就彻底明了了呢?然后回到引子中的问题

普崔希德叫兽 answered 13 years, 4 months ago


LZ,真没必要纠结
这个不同的编译器,答案不同的
如果你要搞清楚你的编译器的规则
建议看反汇编,那里一步一步的计算过程

后宫魔理沙 answered 13 years, 4 months ago


<fieldset> <legend> 探讨 </legend>


如果那老师出的题,问你老师答案,如果是哪本书出的,把书扔了,如果哪面试出的,不去也罢。。

</fieldset>


火焰喵·燐 answered 13 years, 4 months ago

Your Answer