繁体   English   中英

使用size_t的负值切换

[英]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)。

所以,你的-1size_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_tnum的提升类型)。 由于num的值就是那个,所以执行该case语句中的代码。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM