这是非常简单的代码,
#include <iostream>
using namespace std;
int main() {
unsigned int u=10;
int i;
int count=0;
for (i=-1;i<=u;i++){
count++;
}
cout<<count<<"\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
count的值是0.为什么?
两个操作数<=必须被提升为相同的类型.
显然他们被提升为unsigned int(我没有在我面前的标准规则,我会在一秒钟内查看).由于(unsigned int)(-1) <= u是假的,循环永远不会执行.
该规则见标准第10节第5节(expr),其中指出(我已经强调了适用于此的规则):
许多期望算术或枚举类型的操作数的二元运算符会以类似的方式引起转换并产生结果类型.目的是产生一个通用类型,它也是结果的类型.此模式称为通常的算术转换,其定义如下:
- 如果任一操作数具有作用域枚举类型(7.2),则不执行任何转换; 如果另一个操作数的类型不同,则表达式格式不正确.
- 如果任一操作数的类型为long double,则另一个操作数应转换为long double.
- 否则,如果任一操作数为double,则另一个操作数应转换为double.
- 否则,如果任一操作数是浮点数,则另一个操作数应转换为浮点数.
- 否则,应对两个操作数执行整体促销(4.5).60然后,以下规则应适用于提升的操作数:
- 如果两个操作数具有相同的类型,则不需要进一步转换.
- 否则,如果两个操作数都具有有符号整数类型或两者都具有无符号整数类型,则具有较小整数转换等级类型的操作数应转换为具有较大等级的操作数的类型.
- 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的秩,则具有有符号整数类型的操作数应转换为具有无符号整数类型的操作数的类型.
- 否则,如果具有有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数应转换为具有有符号整数类型的操作数的类型.
- 否则,两个操作数都应转换为与带符号整数类型的操作数类型相对应的无符号整数类型.