[英]switch with a negative value for 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對控制表達式執行整數提升。 每個case標簽中的常量表達式將轉換為控制表達式的提升類型。 如果轉換后的值與提升的控制表達式的值匹配,則控制將跳轉到匹配的案例標簽后面的語句。
size_t
也是標准的無符號類型(6.5.3.4 sizeof運算符,Semantics,4)。
所以,你的-1
在size_t num = -1;
中都被轉換為size_t
size_t num = -1;
case -1:
. 難怪(size_t)-1==(size_t)-1
計算結果為true。
是的,這個行為是定義的。 這些值會按照您的預期轉換為size_t
。 從C99§6.8.4.2/ 5:
對控制表達式執行整數提升。 每個
case
標簽中的常量表達式將轉換為控制表達式的提升類型。 如果轉換后的值與提升的控制表達式的值匹配,則控制將跳轉到匹配的case
標簽后面的語句。
“控制表達式”是在switch
關鍵字后出現在括號內的表達式,即在這種情況下為num
。
因此,case標簽中的-1
將轉換為size_t
( num
的提升類型)。 由於num
的值就是那個,所以執行該case語句中的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.