这是什么?c++中的操作符
What does this ? operator in C++ do?
考虑这个函数
template<class T> inline bool cx(T &a, T b) {return a < b ? a = b, 1 : 0;}
谁能解释一下这到底是怎么回事?这似乎与典型的condition ? true : false
格式不同。
我们可以这样写得更清楚:
return a < b ? (a = b, 1) : 0;
括号位表示"将b
赋给a
,然后使用1
作为我们的值"。
C和c++中逗号分隔的值列表通常表示"计算所有这些值,但使用最后一个作为表达式的值"。
这个组合有点棘手,因为它将逗号操作符与条件表达式结合在一起。解析如下:
-
a < b
为条件, -
a = b, 1
是"when true"表达式 -
0
是"when false"表达式
逗号操作符的结果是它的最后一个组件,即1
。首先使用逗号操作符的目的是引起将b
赋值给a
的副作用。
您可以使用,
执行多个表达式
在这种情况下,如果<B,然后将B赋值给a并返回1。根据c++语法:>
conditional-expression:
logical-or-expression
| logical-or-expression ? expression : assignment-expression
,
expression:
assignment-expression
| expression , assignment-expression
assignment-expression:
conditional-expression
| logical-or-expression assignment-operator initializer-clause
| throw-expression
,
运算符只计算从左到右的所有表达式,并计算最右边的表达式的值。
你的代码与…相同
if (a < b)
{
a = b;
return 1;
}
else
{
return 0;
}
读取为:
if ( a < b )
{
a = b;
return ( 1 );
}
else
{
return ( 0 );
}
a < b ? a = b, 1 : 0
被解析为(a < b) ? (a = b, 1) : 0
,一个普通的条件运算符。当a < b
为true时,通过将b
赋值给a
,然后"返回"1来求a = b, 1
。因此,cx(a,b)
的净效果是将较大的值赋给a
,如果a
发生了变化,则返回1,否则返回0。
相关文章:
- 为什么map有操作符[],set没有
- 我可以将C 17 Capture lambda ConstexPR转换操作符的结果用作函数指针模板非类型参数吗?
- c++新操作符通过libstdc++占用大量内存(67MB)
- 复制/移动操作符是否可以安全地用于实现复制/移动分配操作符
- 提升::精神::因果报应使用有条件的替代操作符(|)
- 促进几何体操作符
- 如果操作符delete没有实现,为什么不编译它
- 在使用放置新操作符时,我真的需要担心对齐问题吗
- 我怎样才能让getline操作符工作
- 在重载的全局new操作符中使用静态对象会导致核心转储运行时错误
- 提升ipc new和delete操作符
- 在c++中使用new操作符动态分配数组
- 操作符的大小在C++
- 如何将向量中的对象传递给操作符
- 一个更容易的拷贝分配操作符实现
- 如何重写复杂的c++代码行(嵌套的三元操作符)
- boost::make_shared没有调用(放置)操作符new
- 新操作符(以及malloc)无法分配~450MB的内存
- 类、异常和操作符
- 当delete操作符释放内存时,我为什么需要析构函数