我有一个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
都返回相同的类型。
答案 0 :(得分:8)
在C中不允许这样做,因为在指针取消引用和条件之后,*a
是int
值;不是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;