[英]switch with a negative value for size_t
如果我有以下代码段:
size_t num = -1;
switch(num) {
case -1:
printf("Minus one!\n");
break;
default:
printf("Not minus one!\n");
}
为什么程序会打印Minus One!
? num
转换为switch
语句中的size_t
? 是否定义了此行为?
从交换机的C标准:
6.8.4.2 switch语句
...
语义
...
5对控制表达式执行整数提升。 每个case标签中的常量表达式将转换为控制表达式的提升类型。 如果转换后的值与提升的控制表达式的值匹配,则控制将跳转到匹配的案例标签后面的语句。
size_t
也是标准的无符号类型(6.5.3.4 sizeof运算符,Semantics,4)。
所以,你的-1
在size_t num = -1;
中都被转换为size_t
size_t num = -1;
case -1:
. 难怪(size_t)-1==(size_t)-1
计算结果为true。
是的,这个行为是定义的。 这些值会按照您的预期转换为size_t
。 从C99§6.8.4.2/ 5:
对控制表达式执行整数提升。 每个
case
标签中的常量表达式将转换为控制表达式的提升类型。 如果转换后的值与提升的控制表达式的值匹配,则控制将跳转到匹配的case
标签后面的语句。
“控制表达式”是在switch
关键字后出现在括号内的表达式,即在这种情况下为num
。
因此,case标签中的-1
将转换为size_t
( num
的提升类型)。 由于num
的值就是那个,所以执行该case语句中的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.