这是什么?c++中的操作符

What does this ? operator in C++ do?

本文关键字:操作符 c++ 是什么      更新时间:2023-10-16

考虑这个函数

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。