赋值运算符左边的三元条件运算符

Ternary conditional operator on the left of assignment operator

我有一个condition和三个变量。

// Assume these variables are all initialized.
int *a;
int *b;
const int c;
const bool condition;

if (condition)
    *a = c;
else
    *b = c;

我希望if块通过三元条件运算符在一行上。

(condition ? *a : *b) = c;

我不明白为什么不允许这样做,因为我没有违反三元条件运算符的规则。 *a*b return 是同一类型。

这在 C 中是不允许的,因为 *a 是一个 int 指针取消引用和条件之后;不是 lvalue,即不可分配。但是,这是允许的:

*(condition ? a : b) = c;

既然条件语句产生了一个指针,并且解引用发生在它之外,整个表达式就是一个可赋值的左值。

您可以将其扩展为两个条件和三个指针:

*(condition1 ? a : (condition2 ? b : c)) = d;

你可以这样写

((condition) ? *a : *b) = c;

或者像这样

(condition) ? *a = c : *b = c;

在 C++ 中

没有任何问题
(condition ? *a : *b) = c;

本身。

就C++的规则而言,都可以。

可能的问题包括您可能正在使用未初始化的指针,然后编译器可能会抱怨。但这不可能肯定地说,因为就像上面的错误声明是无效的一样,您 posted 的代码是 ¹not real code.


¹ 请在您的问题中仅 post 真实代码,并且请不要将疯狂的假设作为所谓的事实,因为这会浪费每个人的时间,并且可能会误导通过 Google 来到这里的人。