我原以为这将是一个通过谷歌解决的简单问题,但我似乎找不到明确的(甚至是推测性的)答案:
使用比较器语句时,隐式转换按什么顺序发生?
int i = -1;
size_t t = 1;
bool result = i < t;
这是否相当于:
bool result = i < int(t); // equals true
or:
bool result = size_t(i) < t; // equals false
这是问题的简单部分 - 第二部分是“一般规则是什么”,因为它可能是:
- “更简单”的参数总是转换为“更复杂”的参数(即 size_t->int),或者
- 第一个(或第二个)参数始终转换为第二个(或第一个)参数的类型,或者
- 内置基元(例如 size_t 和 ints)具有特定的比较器运算符,用于指定具体情况的转换。
这三个看起来都是合理的,尽管第二个会产生与大多数人直观期望的显着不同的行为。
VC++ 编译器似乎认为,当您将 int 与 size_t 进行比较时,值得发出 3 级警告 - 然而,当您从返回 size_t 的函数返回负数时(这会导致一个数字),它只会给出 4 级警告超过返回的最大整数的一半)。
为了摆脱所有 4 级警告,我现在无论如何都明确地投射了所有内容,但我想知道“真相”。这必须在某个地方定义......
这些规则相当复杂,并且取决于实施。
然而,基本上:
两种类型都被“提升”。这意味着任何事情
小于int
被提升为int
。 (在不太可能的情况下
那size_t
小于int
, 将会提升为
一个签名的int
,并失去其无符号性。)
如果其中一种类型可以包含该类型的所有值
other,其他的都转换成这个类型。
如果其中一种类型是无符号的,而另一种类型是有符号的,并且
它们具有相同的大小,有符号的被转换为
未签名。
For int
and size_t
(要求未签名),这
意味着除非size_t
小于int
, the int
将要
被转换为size_t
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)