[英]what is the output of conditional operator with unary operator
我有以下代碼,我不清楚其中的行為。 有人可以幫助條件運算符如何評估以下代碼和 output ans 作為 1
#包括
int main() {
bool delayMessages=0;
bool Delay = false;
delayMessages += Delay ? 1 : -1;
std::cout << "Hello world!"<<delayMessages;
return 0;
}
Ans: Hello world!1
Soemone 能否請幫助如何評估代碼“delayMessages += Delay?1:-1;”
來自C++ 17標准(7.6積分優惠)
6 bool 類型的純右值可以轉換為 int 類型的純右值,其中 false 變為零,true 變為 1。
和(7.14 Boolean 次轉換)
1 算術純右值、無作用域枚舉、指針或指向成員類型的指針可以轉換為 bool 類型的純右值。 零值、null 指針值或 null 成員指針值轉換為 false; 任何其他值都將轉換為 true。 對於直接初始化 (11.6),std::nullptr_t 類型的純右值可以轉換為 bool 類型的純右值; 結果值為假。
最后(8.7 加法運算符)
1 加法運算符 + 和 - 從左到右分組。 對算術或枚舉類型的操作數執行通常的算術轉換。
這個表情語句
delayMessages += Delay ? 1 : -1;
可以像這樣重寫
delayMessages = delayMessages + ( Delay ? 1 : -1 );
帶有條件運算符的表達式的結果是-1
,因為第一個子表達式 ( Delay
) 的計算結果為false
。
所以事實上你有
delayMessages = delayMessages + -1;
變量delayMessage
聲明如下
bool delayMessages=0;
根據 7.14 節中的引述,其值為false
。
在帶有二元加運算符 + 的表達式中,它根據引號(7.6 積分提升)和 8.7 加法運算符轉換為 integer 0 並且您有
delayMessages = 0 + -1;
或者
delayMessages = -1;
再次根據引用 7.14 Boolean 轉換,變量delayMessage
的結果值為true
。
運算符 << 在此語句中輸出 boolean 值為 true 為 1
std::cout << "Hello world!"<<delayMessages;
右側的表達式的計算方式類似於 if 語句。
if (Delay == true)
return 1;
else
return -1;
然后將結果用於+=
賦值。
7.6.19 (6)(賦值和復合賦值運算符)
E1 op= E2
形式的表達式的行為等同於E1 = E1 op E2
除了 E1 只計算一次。 [...]
由於Delay == false
,三元運算符的返回值為-1
。 事實上,您在bool
ean 而不是int
上操作可以使它看起來像您獲得了+1
。
請注意,您會收到編譯器警告C4804 :
警告 C4804:“+=”:在操作中不安全地使用類型“bool”
它是未定義的行為嗎? 不。
7.6.19 (6)(賦值和復合賦值運算符)
[...] 對於 += 和 -=,E1 應具有算術類型或指向可能的 cv 限定的完全定義的 object 類型的指針。 在所有其他情況下,E1 應具有算術類型。
和
7.3.8(2)(積分轉換)
如果目標類型是 bool,請參見 7.3.14。
這說
7.3.14(1)(布爾轉換)
算術純右值、無作用域枚舉、指針或指向成員的指針類型可以轉換為 bool 類型的純右值。 零值、null 指針值或 null 成員指針值轉換為 false; 任何其他值都將轉換為 true。
所以 -1 被轉換為true
並且true
打印為 1。
Delay ? 1 : -1
計算結果為-1
,因為Delay
為假。 將-1
轉換為bool
會產生true
,因為只有0
會轉換為false
。 然后印刷true
的印刷品1
。 無論Delay
是true
還是false
,結果都是true
並且在兩種情況下都打印1
。
對布爾值使用true
/ false
,對整數使用 integer 類型。 也許這就是您真正想要做的:
int delayMessages=0;
bool Delay = false;
delayMessages += Delay ? 1 : -1;
std::cout << "Hello world!"<<delayMessages;
delayMessages += Delay ? 1 : -1;
這基本上意味着如果Delay
為真,則delayMessages += 1
(即 1),否則delayMessages += -1
(也是 1)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.