今天做了一道水题,POJ-1004,水题一个,12个double类型的数求平均数

但是,

 #include <iostream>
#include <cstdio>
using namespace std;
int main() {
double n;
while (cin>>n) {
int i=;
double total = n;
while (i++<) {
cin>>n;
total += n;
}
printf("$%.2lf\n", total/);
}
return ;
}

这个看起来没毛病的代码,竟然WA了,

又WA两次之后,这不是代码的事,分别用GCC,G++,C++提交,到C++的时候,A了!!!

总结总结,避免再犯

------------------------------------------------------------------------------------------------------------------------

放在最先:G++和GCC分别是C++和C的编译器,C++和C是语言。

但POJ上的则表示你提交代码运行所需的编译器,C和C++对应的编译器是VC++ 2008里面的C和C++编译器,而GCC和G++则对应相应的编译器。

那我上面既用了printf又用了cin怎么提交?

看到一篇博客叙述:G++和C++选项下的代码是没有差异的,但在库上面,两者有一定差距,比如G++默认可以cin一个string变量,而选择C++时则需要#include<string>,如果用C++编写代码,提交时最好选择G++作为编译器。

不好意思,我没用string类, 但是G++提交WA!!!

说明区别不止这一点。

------------------------------------------------------------------------------------------------------------------------

为什么G++提交WA了?

好吧回到现实中来。我昨天在做poj 3122这道题的时候,再一次的遇到了G++WA;C++AC的尴尬局面。

为什么呢?其实这个也算是编译器优化的一部分,那就是精度缺省。

众所周知,long long类型,作为一个在C/C++11才被确认为基本数据类型的一个数据类型,在不同的环

境下,他的类型标识符是不同的。也就是我们津津乐道的%lld 和 %I64d了。同样,double类型也是一

个有趣的类型。double类型其实准确地说是双精度型,他的内存长度一般是比float类型(单精度型)

的多了一倍,有的时候很早的标准里是把double称为long float的。所以说就有了为什么float类型

用%f,double用%lf。但是由于现在不是以前的那种一个内存条就几兆,多开一个double就会超内存的

年代了,所以double还有float在gcc中被自动优化。

在用scanf读数据时,为了与float区分,使用%lf。

在用printf写数据时,由于实质上,double和float是同一个类型,只不过内存占用有差异而已,他们

的标识符都是%f,注意,这个和标准C不同,这里的都是%f。

当然对于另外一个特殊的类型long double虽然不常用,但是编译器依旧在支持,这里有个插曲,理论

上long double应该是两倍的double(类似long long和int的关系,因为long和int其实是一个东西)

。但是实际上,long double很奇怪的是一个10字节的怪物,他有两个空余字节,是怎么改动都不会发

生变化的。输入输出的标识符都是%Lf,大写的L。

但是这里又有问题了,为什么我在本地用%f会WA,在OJ上用%f会AC?

因为我们本机如果使用的是Windows下的Code::Blocks这款IDE的话,编译器也就是MinGW这个东西。事

实上,为了尽量保持gcc的跨平台性,MinGW在某些地方是直接用了MSVC的东西的,而对我们影响最大的

就是这个标识符的问题。简单的说,如果你是要在本机测试,那么最好,请使用标准C的那个标识符系

统;如果你要提交代码,那么请改成gcc的那一套标识符系统。

再有就是编译器版本的问题,现在的MinGW版本已经到了4.8,但是POJ上仍然使4.4,所以低版本的编译

器同样会有一些不寻常的问题。

当然还有更简单的方法,就是直接用输入输出流在控制输入输出,这样更省事,而且跨平台性能更好,

不会出现这种因为标识符而出错的情况。

列个表格出来就是这个样子的:

列个表格出来就是这个样子的:

double f; POJ G++提交 POJ C++提交 本机测试(MinGW GCC 4.8) 最安全的方法
输入 scanf(“%lf”, &f); scanf(“%lf”, &f); scanf(“%lf”, &f); cin >> f;
输出 printf(“%f“, f); printf(“%lf”, f); printf(“%lf“, f); cout << f;

------------------------------------------------------------------------------------------------------------------------

原来还有精度的问题,那么总结:

1.用string的时候,c++需要包含头文件:#include <string>,G++不需要

2.精度问题

3.使用GCC/G++的提醒:

对于64位整数, long long int 和 __int64 都是支持并且等价的.但是在读和写的时候只支持scanf("%I64d", ...)和printf("%I64d", ...).

不支持"%lld"是因为MinGW下的GCC和G++使用的msvcrt.dll动态链接库并不支持C99标准.
根据ISO C++标准,在G++下,main函数的返回值必须是int,否则将会导致Compile Error(编译错误)的判答

4.G++/GCC使用scanf、printf时注意引用<stdio.h>/<cstdio>,只引用<iostream>不识别

ACM提交,C++,G++,C,GCC的区别的更多相关文章

  1. [转]G++与GCC的区别

    转自http://www.52pojie.cn/thread-58109-1-1.html 误区一:gcc只能编译c代码,g++只能编译c++代码两者都可以,但是请注意:1.后缀为.c的,gcc把它当 ...

  2. 【转】OJ提交时G++与C++的区别

    关于G++ 首先更正一个概念,C++是一门计算机编程语言,G++不是语言,是一款编译器中编译C++程序的命令而已.那么他们之间的区别是什么? 在提交题目中的语言选项里,G++和C++都代表编译的方式. ...

  3. OJ提交题目中的语言选项里G++与C++的区别

    一.OJ提交题目中的语言选项里G++与C++的区别 http://www.th7.cn/Program/cp/201405/199001.shtml 首先更正一个概念,C++是一门计算机编程语言,G+ ...

  4. 【编程基础】编译器 cc、gcc、g++、CC 的区别

    参考 1. 编译器 cc.gcc.g++.CC 的区别; 完

  5. 详解C/C++ 编译 g++ gcc 的区别

    我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++, 或者说编译用gcc,链 接用g++,一时也不知哪个说法正确,如果再遇上个ex ...

  6. 编译器 cc、gcc、g++、CC 的区别

    gcc 是GNU Compiler Collection,原名为Gun C语言编译器,因为它原本只能处理C语言,但gcc很快地扩展,包含很多编译器(C.C++.Objective-C.Ada.Fort ...

  7. g++ gcc 的区别

    我们在编译c/c++代码的时候,有人用gcc,有人用g++,于是各种说法都来了,譬如c代码用gcc,而c++代码用g++,或者说编译用gcc,链 接用g++,一时也不知哪个说法正确,如果再遇上个ext ...

  8. cc、gcc、g++、CC的区别和联系

    gcc是C编译器:g++是C++编译器:linux下cc一般是一个符号连接,指向gcc:gcc和g++都是GUN(组织)的编译器.而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Lin ...

  9. cc、gcc、g++、CC的区别概括

    gcc是C编译器:g++是C++编译器:linux下cc一般是一个符号连接,指向gcc:gcc和g++都是GUN(组织)的编译器.而CC则一般是makefile里面的一个名字,即宏定义,嘿,因为Lin ...

随机推荐

  1. "export" in SHELL

    在shell中,若某一变量需要在随后的子程序中运行,则需要以 export 来使变量变成环境变量: export var export的用法总结: 1:一个shell中用export定义的变量,只对当 ...

  2. English Phrases

    @1:Phrases requst sth from/of sb 向某人要求某物 a new lease on life   重获新生.焕发生机 state of the art 最先进的 at th ...

  3. python并发编程之多进程2-(数据共享及进程池和回调函数)

    一.数据共享 1.进程间的通信应该尽量避免共享数据的方式 2.进程间的数据是独立的,可以借助队列或管道实现通信,二者都是基于消息传递的. 虽然进程间数据独立,但可以用过Manager实现数据共享,事实 ...

  4. sql server分区

    1. 创建分区 分区步骤:1.创建分区函数  2.创建分区架构 3.创建分区索引(聚集)   --1. 创建分区函数 DECLARE @dt datetime SET @dt = '20030901' ...

  5. KVM虚拟化安装配置

    一.KVM的基础配置及安装: 1.查看是CPU否支持虚拟化: [root@oldboy-node1 ~]# grep -E "(vmx|svm)" /proc/cpuinfo vm ...

  6. php的异常和处理

    常见错误处理类型 语法错误 环境错误 逻辑错误 常见错误级别 Deprecated 最低级别的错误 不推荐,不建议,使用一些过期函数的时候会出现,程序继续执行 Notice 通知级别的错误 使用一些未 ...

  7. Kafka Confluent

    今天我们要讲的大数据公司叫作Confluent,这个公司是前LinkedIn员工出来后联合创办的,而创业的基础是一款叫作Apache Kafka的开源软件. Confluen联合创始人Jun Rao即 ...

  8. linux免密登录配置

    第一步:安装openssh-clients yum install -y openssh-clients.x86_64第二步:生成密钥 ssh-keygen第三步:拷贝公钥到其他机器 ssh-copy ...

  9. OWASP十大攻击类型详解

    随着WEB应用技术的不断进步与发展,WEB应用程序承载了越来越多的业务,而随之而来的也是WEB应用所面临的越来越复杂的安全问题.而WEB日志作为WEB安全中的一个重要组成部分,不但可在事后起到追踪和溯 ...

  10. QGIS 编译

    QGIS 编译 在编译的过程中花费了很长时间,特别是编译Debug版本.release版本的编译可以从晚上找到很多的资料,但是Debug的编译相对较少.在Debug编译的过程中,需要单独build工程 ...