负值。如果我有下面的代码片段:开关与为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
?这种行为是否定义?
负值。如果我有下面的代码片段:开关与为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优惠是在控制表达式执行的整数。将每种情况下的标签中的常量 表达式转换为控制的表达式的升级类型。如果转换后的值与提升的控制表达式匹配,则 控件将跳转到匹配的大小写标签后面的语句。
size_t
也是每个标准的无符号类型(6.5.3.4 sizeof运算符,语义,4)。
因此,您的-1
在size_t num = -1;
和case -1:
都转换为size_t
。难怪(size_t)-1==(size_t)-1
评估为真。
但是,他们的任何方式,我们可以使用负值的情况下? –
@PrabhatKumarSingh只需确保switch(expression)中的表达式和case constant中的常量都是有符号类型(例如int,long,long long)。 –
是的,此行为已定义。正如您所期望的那样,这些值被转换为size_t
。从C99§6.8.4.2/ 5开始:
对控制表达式执行整数提升。将每个
case
标签中的常量表达式转换为控制表达式的升级类型。如果转换的值与提升的控制表达式的转换值匹配,则控制将跳转到匹配的case
标签后面的语句。
“防治表述”在这种情况下出现的括号内的switch
关键字后的表达,即num
。
因此,案例标签中的-1
转换为size_t
(升级类型num
)。由于num
的值就是这样,所以这种情况下的代码被执行。
你是什么意思'是数字铸造成size_t?',num的类型是size_t。 – Praetorian
不,你*显式声明*'num'为'type_t',然后赋值-1。 –