G++和C++区别和评测注意事项

探讨G++与C++在精度处理上的不同,特别是在long long和double类型的输入输出中,%lld与%I64d,%lf与%Lf的使用区别。文章对比了VSCode与OJ环境下的表现,建议在不同环境下调整标识符系统。

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++ ,就是直接用输入输出流在控制输入输出,省事稳妥。

列个表格出来就是这个样子的:
其他补充
大概就是这么多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值