使用size_t的负值切换

Cod*_*ict 2 c

如果我有以下代码段:

size_t num = -1;

switch(num) {
    case -1:
        printf("Minus one!\n");
        break;
    default:
        printf("Not minus one!\n");
}
Run Code Online (Sandbox Code Playgroud)

为什么程序会打印出来Minus One!?在声明中被num转换为a ?是否定义了此行为?size_tswitch

Ale*_*nze 7

从交换机的C标准:

6.8.4.2 switch语句
...
语义
...
5对控制表达式执行整数提升.每个case标签中的常量表达式将转换为控制表达式的提升类型.如果转换后的值与提升的控制表达式的值匹配,则控制将跳转到匹配的案例标签后面的语句.

size_t 也是标准的无符号类型(6.5.3.4 sizeof运算符,Semantics,4).

所以,你的-1被转化为size_t两个size_t num = -1;case -1:.难怪(size_t)-1==(size_t)-1评估为真.