C语言++符号的问题!vc++6.0和Dev-C++运行结果不一致!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言++符号的问题!vc++6.0和Dev-C++运行结果不一致!相关的知识,希望对你有一定的参考价值。

#include<stdio.h>
int main(void)

int num=1;
while(num++<=2)
printf("%d",num);
getchar();
return 0;

VC里边是34,Dev-C里边是23。
我主要想知道那个++,出循环之后还加不加1了?++是判断条件,那它到底是不是属于循环的呢?!!!
to arongustc:
不好意思说错了,C primer plus里面关于后缀++的解释得到的也应该是3

原文: while(shoes++<18.5)这个表达式将达到19,因为shoe将在比较之后而不是之前增加
只到19。。。

自增符 i++
你的程序里,while里面的表达式可以用括号写出来,更明确一点。
while((num++)<=2)
注意:这里的num是变量。当num自增之后,值会发生变化。也就是说num++的值会发生变化。
标准C里面的这样的。
int num=1;
num++;//相当于num=num+1;
也就是说,运算之前的值num是1.运算之后的num值是2.
所以num++也是一个变量,所以你的问题也很明确了。一个变量的值和2做比较。显然是一个判断表达式。
至于不同编译器中为什么结果不同,具体情况是这样的,由于自增符在不同的编译器中是不同的表现方式。但是通用的编译器,还是按照++符号和变量的位置来判断的。(需要在熟悉编译器的情况下或者在汇编中查看代码。使用debug模式。)
下面说通常情况
例如
int i=0;时
++i和i++。的情况分别是:
++i 这时候,++在i的左边,就先自增,在赋值。也就是说。运算之前i的值是1,赋值之后的值是1.
i++ 则不同,++在i的右边,则先赋值,再自增。也就是说。运算之前i的值是0,赋值之后的值是1.
参考技术A 后缀++,也就是postfix ++,表达式的值就是num的值,但是num会++。
++当然属于循环,因为是出现while的条件表达式中,而条件表达式会在每次循环时求值,直到false为止。这里很显然,Dev-C++的输出是正确的。

VC6相对来说比较老,对标准的支持不是很好,建议使用vc2003以上的版本。

在vc2010中,得出与Dev-C中相同的结果。

楼主可以参考c++标准的文档中的6.5和6.4。追问

嗯,C primer plus里面关于后缀++的解释得到的也应该是3

原文: while(shoes++<18.5)这个表达式将达到19,因为shoe将在比较之后而不是之前增加
只到19。。。

那C等级考试用的什么标准?笔试也是和VC++6.0标准一样吗?那岂不是答案有歧义?

追答

等级考试的我就不清楚了,如果考试用vc6来验证结果,那我只能说遗憾。不用太在意这种考试的结果,因为没多大意义,只要自己心里明白就行。

参考技术B 找到这个问题的答案,还不如不写这种带歧异的表达式,估计这个根本在标准里没有定义追问

这是我们老师上课举例的一个问题,他给的答案是num最后是4,C primer plus里面关于后缀++的解释得到的也应该是4,而且里面并没有说这是不明确的定义,只有一个表达式里面有两个++才可能导致不同环境或编译器的差别把,比如y=n++ + n++;

现在我的问题就是到底怎么解释这个差异?两个编译器运行结果不一样?虽然我觉得前者应该是对的

追答

问题是它不一定解释得清楚,如果标准没有规定,它得值完全依赖编译器,根本没有道理可讲

参考技术C 百度一下 傻蛋

c++汉诺塔程序在vc上编译成功但在netbeans和dev-c++上无法通过编译

先看程序:
// Note:Your choice is C++ IDE
#include <iostream>
using namespace std;
int count=0;
void move(char x,char y)

cout<<" move "<<x<<" to "<<y<<endl;
count++;

void hanoi(int n,char one,char two,char three)
if (n==1)
move(one,three);
else
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);


int main ()

int m;
cout<<"please input the number of disks:"<<' ';
cin>>m;
hanoi(m,'A','B','C');
cout<<"The total times of moving are"<<' '<<count<<endl;
system("pause");
return 0;

以上是我写的程序,在vc上可以运行,但是用gun的编译器就老说“In function `void move(char, char)': `count' undeclared (first use this function) ”和“In function `int main()': `count' undeclared (first use this function)”。无论是netbeans还是dev-c++都是这样说。那个“count”哪里不符合标准c++了啊?应该怎么该才能通过dev-c++的编译呢?

c++编译器是一个与标准化C++高度兼容的编译环境。这点对于编译可移植的代码十分重要。编译器对不同的CPU会进行不同的优化。
常见的C++编译器有如下几种:
GNU C++
g++是一个开源的C++编译器,GCC3.3对标准化C++的支持达96.15%。
值得一提的是,gcc是gnu c的编译器, g++是gnu c++的编译器, 而egcs(Enhanced GNU Compiler Suite)可以认为是gcc的改进版。目前gcc已经改名,从原来代表GNU C Compiler改变为代表GNU Compiler Collection。而MinGW或Cgywin,是在windows平台上的gnu c/c++编译器,以及库文件,运行环境的集合。
Borland C++
该编译以速度快、空间效率高而著称。它的5.5版本对标准化C++的支持达92.73%,而官方称100%符合ANSI/ISO的C++标准和C99标准。
它是Borland公司开发的,是Borland C++ Builder和Borland C++ Builder X这两种IDE的后台编译器。
Visual C++
VC++6.0对标准化C++的兼容仅达83.43%。
它是Visual Studio、Visual Studio.net 2002、Visual Studio.net 2003、Visual Studio.net 2005的后台C++编译器。随着Stanley Lippman等编译器设计大师的加盟,它变得非常成熟可靠了。Visual C++ 7.1对标准C++的兼容性达到98.22%。
********************************
了解的C/C++编译器如下:
GCC家族
Cygwin
Mingw32
DJGPP
Dev-C++(Mingw32)
还有正宗的GNU GCC 2.95.5~3.0.0.4版本
MS家族
MSC 5.0、6.0、7.0
MSQC 1.0、2.5
MSVC 1.0、4.2、6.0、7.0
Borland家族
TC 1.0、2.0
TC++ 1.01、3.0
BC 3.0、3.1、4.0、4.5、5.0、5.02
BCB 3.0、5.0、6.0
其它
Intel C/C++ 5.0
Watcom C/C++ 11.0、11.0c
VectorC 1.3.3
IBM VisualAge for C++
DigitalMars C/C++
KAI C/C++ 4.03f for RedHat 7.2
Lcc4.1
LCC-WIN32 2001-09-25~2002-04-28日版
Small C
CC386
Pacific C
另外还有C的解释器
Quincy
Eic
CINT
在GCC家族中GNU GCC是根本,其它的编译器版本都是从它导出的。其中,Cygwin和Mingw32都是WIN32平台下的编译器,DJGPP是DOS下的32位编译器。大家所熟知的DEV-C++充其量只是GCC的一个外壳,它所自带的编译器就是Mingw32的一个版本。这些GCC的版本中,Cygwin是最大的,它与其说是一个编译器,倒不如说是一套编程工具。它不仅有编译器,还有其它很多的工具。其实,它就是一个UNIX系统在WIN32平台上的实现。实现了大多常用的UNIX工具,最近的版本中连Apache这样的“工具”都集成进来的。不过,Cygwin虽然功能强大,但它却不是很易用(和UNIX相似,熟悉UNIX的人用它可以很快上手),因为太多其它的工具分散了人们的注意力。相比之下Mingw32就要好用得多,它只有最基本的几个编程工具(只可惜它不自带GDB)。GCC中并不只是C/C++编译器,其中还有很多其它的编译器如JAVA,Fortran,ADA等。它是一个编译器集合,不过有些编译器只能在UNIX系统上用。MS家族的编译器就不用说了,大家对它们都很熟悉。VC 7.0(VC.NET)是它的最新产品。Borland家族也不用说,大家也是耳熟能详。最近它才推出了BCB 6.0。
其它的编译器如:Intel C/C++大家一看名称就知道是Intel的东西,它和VC6完全兼容,不过要挂在VC6下才能用。Watcom C/C++是早先编译器四国大战中的一员,原本是很不错的东西,可惜战略不对,现在已不见声息了。倒是以它为基础的一个OpenWatcom现在还在奋战。VectorC是我近日才发现的一个好东东,它是个纯C的编译器。IBM的VisualAge for C++原本是IBM想用来淌C++编译器这片浑水的东西,不过IBM的战略改了,它就被放弃了。DigitalMars C/C++的前身的Symantec C++(它也是编译器四国大战中的一员),不过现在Symantec不做了,于是它的作者就把它改成了DigitalMars C/C++开放给大家使用。以上这些都是WIN32平台上的东西。KAI C/C++是个很强大的C/C++编译器,它是个多平台的编译器。不过现在被INTEL收购了,已经停止开发了。Lcc4.1是个纯C的编译器它是开放源代码的。不过不怎么好用。LCC-WIN32是一个在LCC基础上开发的C语言的集成开发环境,很好用,而且有很详细的资料,FREE!Pacific C是一个纯DOS的C的集成开发环境,就不多说了。Small C CC386都是开放源代码的编译器,它们都很简单,应用来给大家学习编译器的。Quincy Eic CINT都是C的解释器,是用来让大家学习C语言的其中CINT的功能很强大,还支持一些C++的特性。
当然还有很多其它的编译器,这里我给出的编译器都是可以在WIN32或DOS平台上用的(除KAI外)。UNIX平台上的编译器还是以GNU的为主,其它的我就不是很清楚了。
在以上的编译器中,最特别的就是VectorC这个东西只支持纯C。但它却号称是最快的编译器,不过经过我的试验,它的确在有些情况下强过其它编译器很多!而且它还有个交互式的优化器,可以让你直接看到C代码对映的汇编代码。Cygwin和Mingw32为一母所生,其运行效果相差不大。它们生成的代码效率都很不错,编译的速度也很快,最值得一提的是它们对C++的特性的支持算是所有编译器中最完全的,而且它们还支持C99的大部分特性。这一点很是不错!大家对MS的VC已经很熟悉了,本不用我多说。不过在它的最新的产品VC7.0中,有很大的改进。它对C++的特性的支持比6.0有了很大的提高,是我所用的编译器中是仅次于GCC的。而且它编译出的程序,运行速度很快!仅有少数时候次于VectorC与GCC,其它情况都是最快的!其平均运行速度是最快的。对Borland的产品我也无需多说。它的TC2.0与BC3.1都是我最喜欢的东西。可是现在的BCB却大不如前了,编译的速度和VC6一样慢!IDE还有较多的BUG。最令人想不通的是它生成的代码的运行速度很慢,比LCC-WIN32还慢!它唯一值得一提的就是它的RAD做的比MS的好。Intel的编译器大家可能不熟,它太贵了!还要有VC的支持,很不划算,而且编译速度比VC6还慢。不过它的代码质量很不错。DigitalMars C/C++没有什么亮点,编译速度较快,代码执行速度适中,对C++特性支持还算不错。LCC-WIN32是个很不错的集成开发环境,它只支持纯C。它的编译速度极快!代码执行速度较慢。不过它的最大亮点在于它的IDE,在所有的FREE编程工具中,它的IDE是最专业的,有很强大的代码分析,管理功能。而且它提供了大量的编程资料。
我的效率测试
我曾对一些编译器的代码执行效率做过一些测试,以下是概况:
1. VectorC、VC 7.0 (极快)
2. Intel C/C++、VC 6.0、GCC (很快)
3. DigitalMars C/C++ (一般)
4. LCC-WIN32、BCB、BC5.02 (较慢)
参考技术A 可以用引用的方式在主函数中定义count

#include <iostream>
using namespace std;

void move(char x,char y,int & count )

cout<<" move "<<x<<" to "<<y<<endl;
count++;

void hanoi(int n,char one,char two,char three)
if (n==1)
move(one,three,count);
else
hanoi(n-1,one,three,two);
move(one,three,count);
hanoi(n-1,two,one,three);


int main ()

int m , count(0) ;
cout<<"please input the number of disks:"<<' ';
cin>>m;
hanoi(m,'A','B','C');
cout<<"The total times of moving are"<<' '<<count<<endl;
system("pause");
return 0;


或者将文件头这样写:
#include <iostream.h>

不过编译虽然成功,但是devcpp会出现两个warning
至于#include <iostream> using namespace std ;
和#include <iostream.h>
有什么区别,你在用visual c++ 6.0 和 c#的时候会体会更深一些.因为.h只能是支持输入输出流,而不带.h的包含了许多头文件,比如string等常用的.象我这样的竞赛选手,竞赛都是规定用devcpp的,不过我个人觉得它的编译器超级垃圾.
你可以尝试turbo c for windows这个不错本回答被提问者采纳
参考技术B 你将count写到主函数里面试试。 参考技术C
#include <iostream.h>
//using namespace std

以上是关于C语言++符号的问题!vc++6.0和Dev-C++运行结果不一致!的主要内容,如果未能解决你的问题,请参考以下文章

C语言编译器, 知多少?

C编程中MinGW(代码块)和VC ++ 6.0编译器之间的结果不匹配

MinGw与VC++6.0的区别有那些

vc++6.0和VC2017区别

VC++6.0下C语言怎样控制光标

一文教你区分Visual C++Dev C++codelitecode::blocks