OJ 中,提交代码时,C++ 和 G++的区别

时间:2024-03-25 09:23:26

  1. 概念上:

    • C++是一门计算机编程语言,而G++则是C++的编译器。

    • GCC和G++都是GUN的编译器,cc是Unix系统的C Compiler,而gcc则是GNU Compiler Collection,GNU编译器套装。gcc原名为Gun C语言编译器,因为它原本只能处理C语言,但gcc很快地扩展,包含很多编译器(C、C++、Objective-C、Ada、Fortran、Java)。

  2. 提交上的区别:

    • 在OJ提交的语言选项中,G++,C++代表 两种编译 的方式。

    • 选择C++意味着你将使用C++最标准的编译方式,也就是ANSI C++编译。(补充:更正统)

    • 选择G++则意味这你使用GNU项目中适用人群最多的编译器(其实也就是我们熟悉的Code::Blocks 自带的编译器)。

    • 类似的还有选择C和GCC,前者是标准的C编译器,后者则是用GCC来编译。

  3. 编译时的差异:

    • 编译器优化不同:

      举个栗子: ①: a++ ②: ++a

      从标准C的角度看:①式是先调用,再自增。在调用过程中,会申请一个新的数据地址,用于存放临时的变量a’,然后在把a’加1,之后在把a’赋值给a。但是②式不会这么麻烦,因为它是先自增,后调用,也就省去了申请新地址的功夫。所以理论上,二者的时间消耗是有差异的。

      而如果是使用GCC来编译,那么这两者基本上没有差异。

    • 精度缺省:

      ①long long类型,作为一个在C/C++11才被确认为基本数据类型的一个数据类型,在不同的环境下,他的类型标识符是不同的。也就是我们津津乐道的%lld 和 %I64d了。

      ②double类型也是一个有趣的类型。double类型其实准确地说是双精度型,他的内存长度一般是比float类型(单精度型)的多了一倍,有的时候很早的标准里是把double称为long float的。所以说就有了为什么float类型用%f,double用%lf。

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

      在用printf写数据时,由于实质上,double和float是同一个类型,只不过内存占用有差异而已,他们的标识符都是%f,注意,这个和标准C不同,这里的都是%f。

      列表:

      double num G++提交 C++提交 最安全的方法
      输入 scanf(“%lf”, &num); scanf(“%lf”, &num); cin >> num;
      输出 printf(“%f”, num); printf(“%lf”, num); cout << num;
    • 补充列表:
      OJ 中,提交代码时,C++ 和 G++的区别



        4.补充

        很多ACM的OJ中,语言选GCC就意味着将代码作为.C文件编译。

        G++就是GCC这个编译器集合中的C++编译器,只要你代码按标准C++语法写的,不会有什么问题,注意代码中不要调用特定平台下的库函数或API。

        用C++代码敲代码,一般都会用C++提交,但是后由于一些细微的不同使用不同的编译方式还是会产生差别的,甚至是WR和AC的天壤之别。

        G++是GNU的那个C++编译器,也是Dev-CPP自带的编译器和NOI系列赛官方的编译器。。而C++是VC++,是微软出的编译器
一般来说,两个结果不一样,要么是因为G++效率略低被卡掉,要么是因为写的代码用了C++标准里没规定的东西

        提交C语言代码最好使用G++,G++兼容C和C++。C的代码可以用GCC也可用G++提交,而C++的代码不能够用GCC提交,只能用G++。因此最好一个通过不了的两个都试试,编译器的问题有的时候不好找(尤其是遇到long long 类型的和double的输入输出的时候)。


如何避免由于编译器差别带来的错误 (转载)

1、判题系统使用的是G++编译器,和普通使用的TC,VC都有所不同,建议大家使用Dev C++作为IDE,或者用TC和VC写代码,提交前使用Dev C++编译,预防编译错误。

2、G++包含库的时候不要使用iostream.h,应该使用<iostream>

     C++注意要使用using namespace std;

3、关于整数,在G++下,long和int是完全一样的。

4、浮点数:使用double以减小误差,格式控制字符串是"%lf"(不要使用float)。浮点数的相等不能直接用==来判断,需要使用实数判等。

5、标识符,G++中有一些在VC中没有的保留字,比如and,or,not等等,使用这些保留字作为标识符会产生CE。

6、对于输入输出,建议不要使用cin和cout,这种输入输出方式会比较慢,在数据量大的时候容易引起超时。

7、关于main函数,定义一定要是int型,并记得加上return 0。

int main(){... return 0; }

8、当使用类似于for (int i=0;i<n;i++)这种形式对循环变量进行定义时,注意循环变量的作用域只在这个循环内。

9、输入法在敲代码和提交代码的时候一定要确保关闭,代码中(除了注释部分)有全角字符会引起CE,注释建议使用英文。

10、使用STL的同学请注意例如下面的声明是会引起CE的

vector<vector<int>> adj; 应该改为 vector<vector<int> > adj;

连续两个左右箭头间要一个空格。


转载来源:

        1.http://blog.csdn.net/febr2/article/details/52068357

        2.http://www.cnblogs.com/zswbky/p/5432016.html