赋值运算符左侧的三元条件运算符
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;
【讨论】:
假设c
是int*
。我如何根据condition
将a
或b
分配给c
?无论我如何输入,我的编辑器都不允许。
@Hatefiend 您不能使用一个条件来决定三个选项。你需要第二个条件(见编辑)。
不不,我只有一个condition
。 Here is my actual source code where I am currently getting the problem。它与您谈到的 not an !value
相同的错误。在此屏幕截图中,a
b
和 c
都是 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;
【讨论】:
以上是关于赋值运算符左侧的三元条件运算符的主要内容,如果未能解决你的问题,请参考以下文章
为啥要使用三元运算符而不为“真”条件赋值 (x = x ?: 1)