在C++中,以下两种比较有什么不同吗?
double x = ...;
bool cmp1 = x > 1;
bool cmp2 = x > 1.0;
对于cmp1
,文字1是否首先像通常的混合类型算术一样转换为double
?(如果是,你能给我指一下标准中的相关定义吗?(
一般来说,比较/分配浮点变量的整数文字或浮点文字有关系吗?分配情况如下:
double x1 = 1;
double x2 = 1.0;
以下两个比较在任何方面都不同吗?
通常没有区别。他们是一样的。RHS代码变为double
,然后进行比较。
下面是C分析,我相信C++继承了它。
当源代码值不精确为double
(大整数(时,会出现潜在的差异。
利用x > 12345678901234567891.0
,代码被转换为每"1"的double
;结果是以实现定义的方式选择的最接近的可表示值,或者紧邻最接近可表示值的较大或较小可表示值。
对于x > 12345678901234567891u
,代码被精确地转换为整数常数,并且然后被转换为double
;如果被转换的值在可以表示但不能精确表示的值的范围内,则结果是以实现定义的方式选择的最接近的较高或最接近的较低的可表示值。
我希望这两者都能生成相同的double
,但考虑到措辞上的细微差异,并且它们都是实现定义的行为,但并不相互关联,因此可能存在差异。它归结为编译器的实现质量。
当然,long long
范围之外的源代码整数是有问题的。
通常,将整数文字或浮点文字与浮点变量进行比较/赋值有关系吗?
通常,最好通过编码一个通用类型进行比较。形成普通类型的路径可能会暴露出微妙的转换效果。