赋值运算符

时间:2017-02-25 09:02:18

标签: c++ c syntax ternary-operator lvalue

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

3 个答案:

答案 0 :(得分:8)

在C中不允许这样做,因为在指针取消引用和条件之后,*aint;不是lvalue,即不可转让。但是,这是允许的:

*(condition ? a : b) = c;

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

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

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

答案 1 :(得分:1)

在C ++中,

没有错
(condition ? *a : *b) = c;

本身。

就C ++规则而言,这一切都很好。

可能的问题包括您可能正在使用未初始化的指针,编译器可能会抱怨这些指针。但这是不可能肯定的,因为正如上述不正确的声明无效,您发布的代码是¹不是真正的代码

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

答案 2 :(得分:0)

您可以像这样写

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

或者像这样

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