G++和C++的区别和评测注意事项
我昨天在做POJ3122这道题的时候,遇到了G++WA;C++AC的尴尬局面。
为什么呢?后面查了一下, 得到了答案是这样子的: 其实这个算是编译器优化的一部分,那就是精度缺省。
long long类型,在C/C++11才被确认为基本数据类型的一个数据类型,在不同的环境下,类型标识符还是不同的。也就是%lld 和 %I64d。double类型也是如此。double类型其实准确地说是双精度型,内存长度一般是float类型(单精度型)的两倍,所以很早的标准里是把double称为long float的。所以说为什么float类型我们习惯与用%f输入,double用%lf。
但是在g++里面有:
在用scanf读数据时,为了与float区分,使用%lf。
在用printf写数据时,由于实质上,double和float是同一个类型,只不过内存占用有差异而已,他们的标识符都是%f。
当然对于另外一个特殊的类型long double虽然不常用,但是编译器依旧在支持,这里有个插曲,理论上long double应该是两倍的double(类似long long和int的关系,因为long和int其实是一个东西)。但是实际上,long double很奇怪的是一个10字节的怪物,他有两个空余字节,是怎么改动都不会发生变化的。输入输出的标识符都是%Lf,大写的L。
所以为什么我在本地用%lf会AC,在OJ上用%lf会WA?
我本地使用的vscode配置的gdb环境,编译器也是MinGW这个东西。事实上,为了尽量保持gcc的跨平台性,MinGW在某些地方是直接用了MSVC的东西的,而对我们影响最大的就是这个标识符的问题。简单的说,如果你是要在本机测试,那么最好,请使用标准C的那个标识符系统;如果你要提交代码,那么请改成gcc的那一套标识符系统。
当然还有更简单的方法,用C++ ,就是直接用输入输出流在控制输入输出,省事稳妥。
列个表格出来就是这个样子的:
大概就是这么多了。