使用size_t的负值切换

时间:2011-10-11 02:01:28

标签: c

如果我有以下代码段:

size_t num = -1;

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

为什么程序会打印Minus One!?在num声明中size_tswitch投放了吗?是否定义了此行为?

2 个答案:

答案 0 :(得分:7)

来自开关上的C标准:

  

6.8.4.2开关声明
  ...
  语义
  ...
  5对控制表达式执行整数提升。常数   每种情况下的表达式标签都会转换为控件的提升类型   表达。如果转换后的值与提升的控制表达式匹配,   控制跳转到匹配的案例标签后面的语句。

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

因此,-1size_t中的size_t num = -1;转换为case -1:。难怪(size_t)-1==(size_t)-1评估为真。

答案 1 :(得分:2)

是的,此行为已定义。正如您所料,这些值会转换为size_t。从C99§6.8.4.2/ 5:

  

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

“控制表达式”是出现在switch关键字后面的括号内的表达式,在这种情况下为num

因此,案例标签中的-1将转换为size_tnum的提升类型)。由于num的值就是那个,因此执行该case语句中的代码。