奇怪的求值顺序问题

yuziyu 2006-11-16 09:08:04
请问下面输出结果
int main()
{
int i=5;
int j = (++i)+(++i);
printf("%d\n",j);
i=5;
j = (++i)+(++i)+(++i);
printf("%d\n",j);
j = (++i)+(++i)+(++i)+(++i);
printf("%d\n",j);
return 0;
}

输出为
14
22
31
请问为什么是这样?
...全文
502 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamliadai 2006-11-17
  • 打赏
  • 举报
回复
严重依赖编译器
kookworm 2006-11-17
  • 打赏
  • 举报
回复
请问下面输出结果
int main()
{
int i=5;
int j = (++i)+(++i);
printf("%d\n",j);
i=5;
j = (++i)+(++i)+(++i);
printf("%d\n",j);
j = (++i)+(++i)+(++i)+(++i);
printf("%d\n",j);
return 0;
}

输出为
14
22
31
请问为什么是这样?

------------------------------------------------
与编译器有关,lz给出的答案应该是在VC6.0下的运行结果,如果你在TC2.0或TC3.0下运行结果就是14、24、36了,所以必须针对具体的编译环境才能说结果是什么,离开编译环境,就不好分析结果了。
ll_net 2006-11-17
  • 打赏
  • 举报
回复
没有实用价值,lz可以拒绝回答,除非lz面试的是基于底层开发。。
tyc_2000_ren 2006-11-17
  • 打赏
  • 举报
回复
vc6 correct!
xundeng 2006-11-17
  • 打赏
  • 举报
回复
根先进后出原则。
14 = 7+7
22 = 8 + 7 + 7
31 = 9 + 8 + 7 + 7;
j = (++i)+(++i)+(++i)+(++i);
计算的时候 先取出最后两一条指令( 最后的两个(++i)+(++i) )
先做两次(++i)再做加法 得到14 此时i=7最取出一条批令。(倒数第三个(i++))
先做(++i)得i=8再加上原来的14得22
再取出最后一个(++i)此时的i=8先做(++i)得i=9加上原来的22得最终结果
31;

但是这个结果只能是某些编译器的结果。
因为 (++i)它的优先级比 + 更应该先算。这样结果就变变成14,24,36了;

做鸡真好吃 2006-11-17
  • 打赏
  • 举报
回复
mark~
andyhuang_one 2006-11-17
  • 打赏
  • 举报
回复
同意,这样写法简直是自寻烦恼。
pandengzhe 2006-11-17
  • 打赏
  • 举报
回复
垃圾!
编译器不同,结果不同
一定要拒绝回答。。。
renmasheshou 2006-11-17
  • 打赏
  • 举报
回复
同意,对于这样的文字游戏没有什么玩头!
漂流的代码 2006-11-17
  • 打赏
  • 举报
回复
非常恶心的问题,如果是面试题的话,我劝楼主一定要拒绝回答:
对于商业软件来讲,原因有三:
1. 编译器的实现不同,结果可能有差别,因此该代码的无可移植性
2. 该代码的可读性非常差,一个人一个结构,程序不仅是写的,更是读的,这样代码别人和自己都无法维护
3. 该代码效率极其低下,完全是无用代码。如果编译器足够聪明的话,会被优化成很短的代码。
所以,作为一个合格的程序员,一定要视这种代码为洪水猛兽,否则,你的职业生涯将被毁掉。
凌风_ 2006-11-17
  • 打赏
  • 举报
回复
这种东西在工作中真的有人敢用??
甘拜下风~
yuziyu 2006-11-16
  • 打赏
  • 举报
回复
14
22
31
这个结果是在gcc下测试的
whiteme 2006-11-16
  • 打赏
  • 举报
回复
++或者--为自加或自减运算,在变量单独使用++时如for(i=0;i<n;++i)与for(i=0;i<n;i++)是没有区别的 i++ 与 ++i 等价于 i+=1 ,但在与其他变量组成表达式时,前缀与后缀是有区别的,就如LZ所问 ,前缀是在访问变量的值前先执行i+=1;后缀与之相反
所以J=(++I)+(++I) 分析如下 变量I初值为5,所以第一个I为6 第二个I为7,后面的同理,2级题吧?要是工作了这么编码 PL打死你!
alan001 2006-11-16
  • 打赏
  • 举报
回复
我也觉得应该是:
13
21
30
hailongchang 2006-11-16
  • 打赏
  • 举报
回复
这种问题没什么好说的,反汇编结果,自己看吧:

_DATA SEGMENT
$SG794 DB '%d', 0aH, 00H
$SG795 DB '%d', 0aH, 00H
$SG796 DB '%d', 0aH, 00H
_DATA ENDS
PUBLIC _main
EXTRN _printf:NEAR
; Function compile flags: /Odt
_TEXT SEGMENT
_j$ = -8 ; size = 4
_i$ = -4 ; size = 4
_main PROC NEAR
; File c:\documents and settings\hailongchang\桌面\csdn\1.c
; Line 4
push ebp
mov ebp, esp
sub esp, 8
; Line 5
mov DWORD PTR _i$[ebp], 5
; Line 6
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
mov ecx, DWORD PTR _i$[ebp]
add ecx, 1
mov DWORD PTR _i$[ebp], ecx
mov edx, DWORD PTR _i$[ebp]
add edx, DWORD PTR _i$[ebp]
mov DWORD PTR _j$[ebp], edx
; Line 7
mov eax, DWORD PTR _j$[ebp]
push eax
push OFFSET FLAT:$SG794
call _printf
add esp, 8
; Line 8
mov DWORD PTR _i$[ebp], 5
; Line 9
mov ecx, DWORD PTR _i$[ebp]
add ecx, 1
mov DWORD PTR _i$[ebp], ecx
mov edx, DWORD PTR _i$[ebp]
add edx, 1
mov DWORD PTR _i$[ebp], edx
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
mov ecx, DWORD PTR _i$[ebp]
add ecx, DWORD PTR _i$[ebp]
add ecx, DWORD PTR _i$[ebp]
mov DWORD PTR _j$[ebp], ecx
; Line 10
mov edx, DWORD PTR _j$[ebp]
push edx
push OFFSET FLAT:$SG795
call _printf
add esp, 8
; Line 11
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
mov ecx, DWORD PTR _i$[ebp]
add ecx, 1
mov DWORD PTR _i$[ebp], ecx
mov edx, DWORD PTR _i$[ebp]
add edx, 1
mov DWORD PTR _i$[ebp], edx
mov eax, DWORD PTR _i$[ebp]
add eax, 1
mov DWORD PTR _i$[ebp], eax
mov ecx, DWORD PTR _i$[ebp]
add ecx, DWORD PTR _i$[ebp]
add ecx, DWORD PTR _i$[ebp]
add ecx, DWORD PTR _i$[ebp]
mov DWORD PTR _j$[ebp], ecx
; Line 12
mov edx, DWORD PTR _j$[ebp]
push edx
push OFFSET FLAT:$SG796
call _printf
add esp, 8
; Line 13
xor eax, eax
; Line 14
mov esp, ebp
pop ebp
ret 0
_main ENDP
_TEXT ENDS
END
cjmdaixi 2006-11-16
  • 打赏
  • 举报
回复
我怎么觉得应该是
13
21
30
yuziyu 2006-11-16
  • 打赏
  • 举报
回复
这个程序是面试题.我想知道答案.
并不是商业程序,重要的是分析它的原因,把它当作编译原理的题目行不?
Dan1980 2006-11-16
  • 打赏
  • 举报
回复
好恶心程序!请不要在同一个表达式里面对同一个变量用超过一次的++运算,谢谢配合。
Dan1980 2006-11-16
  • 打赏
  • 举报
回复
好恶心程序!请不要在同一个表达式里面用超过一次的++运算,谢谢配合。
malligator 2006-11-16
  • 打赏
  • 举报
回复
xin0101() ( ) 信誉:100 Blog 2006-11-16 13:52:09 得分: 0


都错了。答案真是的14。
这要从入站这方面来考虑的。先入后面的I再入前面的I。
仔细想想就能明白啦!

===============
为啥说都错了呀
======
好多人都说“觉得”??
你编的编译器呀
试过就知道,别瞎猜个结果来蒙人!
加载更多回复(8)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧