社区
C语言
帖子详情
奇怪的求值顺序问题
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
请问为什么是这样?
...全文
544
28
打赏
收藏
奇怪的求值顺序问题
请问下面输出结果 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 请问为什么是这样?
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用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)
论文复现风光制氢合成氨系统优化研究(Python代码实现)
内容概要:本文围绕风光制氢合成氨系统的优化
问题
,通过复现相关学术论文并结合Python编程实现,构建了涵盖风能、光伏、电解水制氢及合成氨工艺的综合能源系统模型。研究重点在于对系统内多能流耦合关系进行建模,优化可再生能源的消纳与氢能生产调度,提升系统经济性与能源利用效率。文中详细阐述了系统架构设计、关键设备建模、目标函数设定及约束条件处理,并通过Python代码实现了优化求解过程,展示了完整的仿真流程与结果分析。; 适合人群:具备一定Python编程基础和能源系统知识,从事新能源、综合能源系统、氢能等领域研究的研发人员或高校研究生。; 使用场景及目标:①学习如何将风光耦合制氢与化工生产(合成氨)进行系统集成建模;②掌握基于Python的能源系统优化方法,如线性规划、混合整数规划等在综合能源调度中的应用;③复现并深入理解相关领域高水平学术论文的技术路线与实现细节。; 阅读建议:建议读者结合文中提供的代码与模型描述,动手实践并调试程序,重点关注目标函数构建与约束条件的数学表达,同时可扩展模型以适应其他类似多能互补系统的研究需求。
p6880880-190000-Linux-x86-64 OPatch 12.2.0.1.52
OPatch 12.2.0.1.52, the Oracle Interim One-off Patch Installer. This patch (6880880) installs the "OPatch" utility. OPatch is used for patching Oracle software. If you have an older version of opatch it is strongly recommended to back it up before upgrading to the new OPatch.
基于红外热成像的热点检测模拟框架,用于使用MATLAB实现架空铁路架空线系统中的热点检测。.zip
1.版本:matlab2014a/2019b/2024b 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
国央企如何利用产业分析报告提升战略决策的科学性?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
国央企如何借助数智化工具构建科技创新能力监测体系?.docx
科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。
C语言
70,040
社区成员
243,237
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章