C程序在VC++6下编译出现结果让人难以理解!!
下面的代码在VC++6环境下运行结果无法让人理解!#include<stdio.h>#include<stdlib.h>#include<iostream.h>intma...
下面的代码在VC++6 环境下运行结果无法让人理解!
#include <stdio.h>#include <stdlib.h>#include <iostream.h>
int main(){ int m,n=2; m=(++n)+(++n)+(++n)+(++n); cout<<m<<'\n'; cout<<n<<endl; return 0;}
跟踪发现尽然是这样的,编译器是怎么回事?
但在TC2.0中运行正确:m=24
在vC2010中运行也正确 展开
#include <stdio.h>#include <stdlib.h>#include <iostream.h>
int main(){ int m,n=2; m=(++n)+(++n)+(++n)+(++n); cout<<m<<'\n'; cout<<n<<endl; return 0;}
跟踪发现尽然是这样的,编译器是怎么回事?
但在TC2.0中运行正确:m=24
在vC2010中运行也正确 展开
7个回答
展开全部
我刚学C++,谢谢,你给的VC++6的下载地址!我觉得是不是微软编译器版本的问题,看来还是要用 VC2010版本好。好多分啊,能不能给我啊?开玩笑的啦!
追问
是版本的问题,从反编译的汇编代码可以看出来!不用谢,应该的,如果没有满意的答案,就给你,呵呵!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
给一下我的解释吧,首先函数内申明int m,n=2;是不合适的,分开写,因为这时候m的值不是2,你可以debug看一下就明白了。
其次,由于++的优先级高于+, 所以在做+之前所有的++n都已经提前运算了,所以m的值是m=6+6+6+6等于24,这是vs2010的结果,至于19,不是太明白,要是18倒是能接受,也许就是旧编译器的算法问题。
其次,由于++的优先级高于+, 所以在做+之前所有的++n都已经提前运算了,所以m的值是m=6+6+6+6等于24,这是vs2010的结果,至于19,不是太明白,要是18倒是能接受,也许就是旧编译器的算法问题。
追问
我试了,在vc2010中运行正确的,但VC6怎么回事,怎么这么弱智的编译器都有呢?是不是可以在哪里设置一下!
追答
6.0的编译器我看过一篇文章,提示有好多限制的,就是要你写代码的时候要写得很清楚的,像这种情况的就不能这样写了,当然后来的编译器已经解决这个问题了,所以6.0被淘汰了。当然一般写代码的时候也不会这么写了,这样写会被骂的,只有面试的时候拿来装逼用的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
VC++6.0下是如下操作的:
先把第一、二个表达式加起来存储在m中(也可存储在一个临时变量a中),m=++n+ ++n=4+4=8;
第三个n增1加在m上,m=m+5=8+5=13;
第四个n增1加在m上,m=m+6=13+6=19.
不必责怪VC++6.0的编译器。C/C++没有具体规定表达式的算法细节,VC++6.0的编译器这么做合法!别的编译器有另外做法也合法——这就是专家们常强调的“不要写边缘化语句”的原因——因编译器有不同解释而降低了代码的移植性。仅供参考……
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
写出这种代码的直接抄鱿鱼, 请参参考【C Prime Plus 5.3.6 不要太聪明 】
追问
还没有炒鱿鱼的机会,只是编译着试试!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询