gpt4 book ai didi

c++ - C++中三元运算符的意外行为

转载 作者:行者123 更新时间:2023-12-01 14:03:55 24 4
gpt4 key购买 nike

以下是我编写的代码片段:

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 ,它丢弃该值并计算下一个表达式 vec.push_back(j)返回 void .

因此整个 的最终值第二个操作数 类型为 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 ,因此没有错误。

关于c++ - C++中三元运算符的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61772873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com