簡體   English   中英

C++ 中三元運算符的意外行為

[英]Unexpected behaviour of ternary operator in C++

以下是我編寫的代碼片段:

int n,i,j;
map<int,int>mp;
vector<int>vec;
cin>>n;
for(i=0; i<n; i++)
{
    cin>>j;
    mp[j]==0? mp[j]=1,vec.push_back(j): mp[j]=1;
}

對於for循環內的第二行,CodeBlocks-16.01 版本顯示以下錯誤:

second operand to the conditional operator is of type 'void', but the third operand is neither a throw-expression nor of type 'void'

但是當我將行更改為:

mp[j]==0? vec.push_back(j), mp[j]=1: mp[j]=1;

沒有錯誤。 以下行有什么問題?

mp[j]==0? mp[j]=1,vec.push_back(j): mp[j]=1;

為了理解錯誤,讓我們看一下條件運算符的操作數。

第二個操作數:

mp[j]=1, vec.push_back(j)

操作數是由comma operator分隔的兩個表達式。
逗號運算符在這里的工作方式是它評估mp[j]=1導致值1 ,它丟棄該值並評估返回void的下一個表達式vec.push_back(j)

因此,整個第二個操作數最終值void類型(這就是錯誤所說的)。

第三個操作數:

mp[j]=1

此表達式的計算結果為1 ,其類型為int (因此它不是voidthrown-exception ,這就是錯誤所說的)。

當您更改第二個操作數時:
在表達式中

vec.push_back(j), mp[j]=1

vec.push_back(j)評估為void ,該值被丟棄,然后mp[j]=1評估為1 ,即int類型。 現在兩個操作數都是int ,因此沒有錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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