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

Posted

技术标签:

【中文标题】赋值运算符左侧的三元条件运算符【英文标题】:Ternary conditional operator on the left of assignment operator 【发布时间】:2017-07-16 04:38:09 【问题描述】:

我有一个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 返回相同的类型。

【问题讨论】:

−1 代码不是真实代码,所谓的事实是不真实,如果代码已更正,它仍然使用 C++ 特定功能,而问题被标记为 多种语言,包括 C++ 和 C。 因为这个三元条件运算符的语法在 C 和 C++ 中都是一样的 【参考方案1】:

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

*(condition ? a : b) = c;

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

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

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

【讨论】:

假设cint*。我如何根据conditionab 分配给c?无论我如何输入,我的编辑器都不允许。 @Hatefiend 您不能使用一个条件来决定三个选项。你需要第二个条件(见编辑)。 不不,我只有一个condition。 Here is my actual source code where I am currently getting the problem。它与您谈到的 not an !value 相同的错误。在此屏幕截图中,a bc 都是 struct Node* 类型。我不明白出了什么问题。所有变量都不是const 等等...am I not allowed to use this syntax in C? @Hatefiend 然后你需要获取地址并使用*,像这样:*(condition ? &a : &b) = c【参考方案2】:

在 C++ 中没有任何问题

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

本身。

就C++的规则而言,一切都OK。

可能的问题包括您可能使用了未初始化的指针,编译器可能会抱怨这些问题。但这不可能肯定地说,因为就像上面的错误声明无效一样,您发布的代码是¹不是真正的代码


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

【讨论】:

就像我说的,我把上面的cmets说所有的变量都初始化了。一旦你开始用某些值初始化东西,*** 将开始寻找替代方法来根据这些值回答问题,而不一定回答问题的概念。他们可能会问你为什么要尝试做 x 而不是 y。等等。这就是为什么更容易提出假设。【参考方案3】:

你可以这样写

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

或者像这样

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

【讨论】:

以上是关于赋值运算符左侧的三元条件运算符的主要内容,如果未能解决你的问题,请参考以下文章

三元条件和赋值运算符优先级

Perl 三元条件运算符中的赋值问题

为啥要使用三元运算符而不为“真”条件赋值 (x = x ?: 1)

仅当 JavaScript 中的三元运算符中的条件为真时才赋值

三元运算符

C中的三元(条件)运算符