赋值运算符左边的三元条件运算符
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 来到这里的人。
我有一个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 来到这里的人。