Dev C++ 采用的标准比VC更严格 main函数需要为int推荐你使用code::blocks,基本上可以满足你的需求,操作也简单,vc6太大了,cb可以集成很多开发环境的,用用就知道了。Dev-C比vc6.0更新一些,其实我感觉那个都一样,除非你是专业的搞大项目。。。vc是国外淘汰了的--!#include<stdio.h>int main() printf("a"); getchar(); return 0;}一般面对闪一下的就搞一个getchar();表示任意输入一个字符,如果一个不行再加一个。。。。
int i = 3, j = 3;int x = (++i) + (++i) + (++i);int y = (j++) + (j++) + (j++); 看到挺多人在争论,这样的表达式值应该是多少?甚至拿出几个不同的编译器来编译运行得到几个不同的结果。对于此题的答案,一句话,The behavior is undefined! 详细解释待我慢慢说来。大家知道,通常而言,我们写的计算机程序都是从上到下,从左到右依次执行。然而,我只是说通常,因为在编译的过程中,compiler并不仅仅是把source code翻译成binary code就算了,这个过程里面可能还会对代码进行优化,这种优化可能带来的结果是:代码或者表达式evaluation的顺序可能发生变化。这可是一个非常严重的问题,当某个表达式带有side-effect(比如改变了一个变量的值),那么它的执行顺序直接影响到了程序执行的结果。为了保证程序执行具有确定性的结果,C++标准引入Sequence Point这个概念,按照ISO/IEC的定义:At certain specified points in the execution sequence called sequence points. All side effects of previous evaluations shall be complete and no side effects of subsequent evaluations shall have taken place. 简而言之,Sequence Point就是这么一个位置,在它之前所有的side effect已经发生,在它之后的所有side effect仍未开始,而两个Sequence Point之间所有的表达式或者代码执行的顺序是未定义的! 而C++标准又进一步规定了Sequence Point出现的5种情况:At the end of a full expression After the evaluation of all function arguments in a function call and before execution of any expressions in the function body After copying of a returned value and before execution of any expressions outside the function After evaluation of the first expression in a&&b, a||b, a?b:c, or a,b After the initialization of each base and member in the constructor initialization list 具体我不详细讨论,只看第一个情况:At the end of a full expression,这里简化问题,full expression简单认为是一个带有;的语句(具体可以再去查标准)。也就是说,任何一个独立的表达式语句的结束都是一个Sequence Point,回到我们的题目: int y = (++i) + (++i) + (++i);整个的语句里面,只有1个Sequence Point,也就是语句的结束点,对于右边表达式的计算顺序没有任何的规定,显然,各种编译器都可以按照他们觉得“舒服”的方式来进行计算,这样的代码,如果只要求在特定的平台或者编译器运行,那么带来的可能只是可读性差的问题,但如果考虑跨平台或者编译器的情况,那么就是完完全全的错误! 另外,需要特别注意的是,对于赋值号(assignment operator),C++也没有把它定义成Sequence Point,也就说这样的语句:buffer[i] = i++;同样是undefined的,因为,对于等号左右两边的表达式运算顺序,你并不能有任何的假定。我算出来的记过是6,为什么会是7呢?听高手讲解我算出来 a=6 不可能是 7 要相信科学!算一下给你看咯: a=(++a)+(++a)+(++a); 第一个 ++a =1 第二个 ++a =2 (是由第一个 ++a 基础上 再 + 1) 第三个 ++a =3 (是由第二个 ++a 基础上 再 + 1)那么 a 最终的结果就是它们三者的和为 6对于前置表达式,是通过引用(by-reference)来处理的。也就是,该表达式还回的是变量自身。++i表达式还回的就是&i,自然i中的值是增加过后的值,不然运算结果就会丢失。对于后置表达式,是通过传值(by-value)来实现的。也就是用一个临时变量来保存结果,然后还回这个临时变量。所以i++的结果是i还没有变化,要到一个完整语句(出现;或者函数调用)后才变化。例如: int j, i= 3; j = (i++)+(i++)+(++i);计算后,i=6,j却可能等于12,也可能等于10.这就取决于编译器了。因为在标准中,并没有规定复合表达式中,相同运算等级的运算顺序是从左边开始还是从右边开始。例如这个例子,从左边开始,就是3+3+4 = 10;从右边开始就成了4+4+4=12了。所以,除非你是在出考试试卷,否则不要在你的程序中出现同一个变量两次以上自增/自减操作符。这除了破坏你程序可读性,增加维护难度外,没有多少帮助。你知道这些就可以推算你的结果了。。。二楼的回答很不令人心服啊。记得以前学习的时候也纠结过这样的问题。好象是编译器的问题。计算有两重顺序,一个是从前往后的顺序 一个从后往前的顺序a = 1 +2 +(++a)a = 3 +4为什么是7呢? 请看下面的汇编代码6: a=(++a)+(++a)+(++a);0040102F mov eax,dword ptr [ebp-4]00401032 add eax,100401035 mov dword ptr [ebp-4],eax00401038 mov ecx,dword ptr [ebp-4]0040103B add ecx,10040103E mov dword ptr [ebp-4],ecx00401041 mov edx,dword ptr [ebp-4]00401044 add edx,dword ptr [ebp-4]00401047 mov eax,dword ptr [ebp-4]0040104A add eax,10040104D mov dword ptr [ebp-4],eax00401050 add edx,dword ptr [ebp-4]00401053 mov dword ptr [ebp-4],edx------------------------------------------------编译器是如何计算的呢?简要说明:首先计算第一个++a得到1,现在的a引用的内存中1.然后计算第二个++a得到2,由于a引用的是同一内存地址,现在a为2.所以第一个++a也为2了.在然后执行第一个(++a)+(++a)=2+2=4 ,该处的4是储存在寄存器中的.然后执行第三个++a,现在a的值为3了.最后(++a)+(++a)+(++a)=2+2+3=7,然后再赋值给a,现在a的值为7了.所以最后的结果为7也就不奇怪了.------------------------------------------------最后:如果不知道这些问题在各种机器上是如何解决的,就最好不要尝试运用某种特殊的实现方式!