int main(){
char c='a';
switch(c){
case 'a' && 1: printf("Hello");
case 'b' && 1: printf("hey");
break;
default : printf("Goodbye");
}
}
當我編譯這段代碼時,結果是“編譯錯誤”,這(據我說)是因為在內部這兩個運算式都是真的,因此對于我們為“c”取的任何字符,這兩種情況下的常量運算式都將始終為真.
但是現在出現了我無法理解的疑問,代碼如何在內部解釋以及編譯器如何實際解釋這段代碼?
uj5u.com熱心網友回復:
運算式'a' && 1和'b' && 1都有值1。
因此,您的代碼嚴格等同于:
...
switch(c){
case 1: printf("Hello");
case 1: printf("hey");
break;
default : printf("Goodbye");
}
}
...
因此出現錯誤訊息,因為兩個或多個案例標簽不能具有相同的值。C 語言不允許這樣做。
uj5u.com熱心網友回復:
對于符合 C 標準的初學者(6.8.4.2 switch 陳述句)
3 每個case標簽的運算式應為整數常量運算式,同一switch陳述句中的任何兩個case常量運算式轉換后的值不得相同
在這種情況下標簽
case 'a' && 1: printf("Hello");
case 'b' && 1: printf("hey");
有使用logical AND運算子。根據 C 標準(6.5.13 邏輯與運算子)
3 如果 && 運算子的兩個運算元比較不等于 0,則 && 運算子將產生 1;否則,它產生 0。結果具有 int 型別。
由于字符整數文字'a'和'b'整數文字1不等于,0因此這兩個運算式計算為相同的整數值1 at compile time。
所以事實上你有
case 1: printf("Hello");
case 1: printf("hey");
因此,兩個 case 標簽在同一個 switch 陳述句中具有相同的常量整數運算式。所以編譯器發出錯誤。
使用logical AND包含等于的運算元的運算子1
case 'a' && 1: printf("Hello");
case 'b' && 1: printf("hey");
沒有意義。
也許您的意思是以下標簽
case 'a' & 1: printf("Hello");
case 'b' & 1: printf("hey");
那是帶有操作員的標簽bitwise AND。
uj5u.com熱心網友回復:
case 運算式'a' && 1和'b' && 1都計算為 1,因為在這兩種情況下每個運算元都不為零。
這意味著您有兩個具有相同值的案例,這是不允許的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/485434.html
上一篇:計算哈希表大小的正確方法是什么
