如果我有以下代码段:
size_t num = -1;
switch(num) {
case -1:
printf("Minus one!\n");
break;
default:
printf("Not minus one!\n");
}
为什么程序会打印Minus One!
?在num
声明中size_t
是switch
投放了吗?是否定义了此行为?
答案 0 :(得分:7)
来自开关上的C标准:
6.8.4.2开关声明
...
语义
...
5对控制表达式执行整数提升。常数 每种情况下的表达式标签都会转换为控件的提升类型 表达。如果转换后的值与提升的控制表达式匹配, 控制跳转到匹配的案例标签后面的语句。
size_t
也是标准的无符号类型(6.5.3.4 sizeof运算符,Semantics,4)。
因此,-1
和size_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_t
(num
的提升类型)。由于num
的值就是那个,因此执行该case语句中的代码。