2011-10-11 57 views
2

负值。如果我有下面的代码片段:开关与为size_t

size_t num = -1; 

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

为什么是它的程序打印Minus One!?是numswitch声明中铸造为size_t?这种行为是否定义?

+1

你是什么意思'是数字铸造成size_t?',num的类型是size_t。 – Praetorian

+0

不,你*显式声明*'num'为'type_t',然后赋值-1。 –

回答

7

从上开关C标准:

6.8.4.2 switch语句
...
语义
...
5优惠是在控制表达式执行的整数。将每种情况下的标签中的常量 表达式转换为控制的表达式的升级类型。如果转换后的值与提升的控制表达式匹配,则 控件将跳转到匹配的大小写标签后面的语句。

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

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

+0

但是,他们的任何方式,我们可以使用负值的情况下? –

+0

@PrabhatKumarSingh只需确保switch(expression)中的表达式和case constant中的常量都是有符号类型(例如int,long,long long)。 –

2

是的,此行为已定义。正如您所期望的那样,这些值被转换为size_t。从C99§6.8.4.2/ 5开始:

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

“防治表述”在这种情况下出现的括号内的switch关键字后的表达,即num

因此,案例标签中的-1转换为size_t(升级类型num)。由于num的值就是这样,所以这种情况下的代码被执行。