簡體   English   中英

一元運算符的條件運算符 output 是什么

[英]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;

然后將結果用於+=賦值。

C++20 標准草案

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 無論Delaytrue還是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM