[英]Using multiple instructions inside ternary operator in C
我是学习 C 的新手,我想知道是否可以在 C 中的三元运算符中启动超过 1 条指令 - 例如:
int a = 5;
int b = 7;
int max;
int min;
max = (a>b) ? a, b = min : b, a = min;
pritnf("%d %d", min, max);
我想对这些数字进行排序并将它们分配给变量 max 或 min。 是否可以告诉程序如果 a > b 它将把 a 保存为最大值并将 b 分配给最小值? 或者我必须使用 If function 来完成吗? 我认为问题在于使用逗号,但我不知道应该使用什么。 我收到的消息是这样的:
警告:逗号运算符的左操作数无效 [-Wunused-value] int max = (a>b)? (a, b = min): (b, a = min);
您的赋值 ( =
) 和逗号运算符 ( ,
) 倒过来了。 但正如评论中所建议的那样,这是晦涩难懂的,而且不必要地难以阅读。 只需写一个if
语句:
int a = 5;
int b = 7;
int max;
int min;
if(a>b){
max=a;
min=b;
}else{
max=b;
min=a;
}
使用三元运算符并不是坏习惯,但要避免使用它来执行多个这样的操作。 不要仅仅if
可以就将其视为某种内联替代品。
对于逗号运算符 ( ,
) 的建议通常是避免使用它。 它是多余的、容易出错的,并且可能与 function 调用和声明中的逗号分隔符混淆。
C中的条件运算符定义如下
conditional-expression:
logical-OR-expression
logical-OR-expression ? expression : conditional-expression
赋值和逗号运算符的优先级较低。
所以这个说法
max = (a>b) ? a, b = min : b, a = min;
相当于下面的语句
max = ( (a>b) ? a, b = min : b) , a = min;
因此,如果a
大于b
,则变量max
和b
被设置为变量min
的不确定值,否则设置为变量b
的值。 然后将变量a
依次设置为min
的不确定值。
看来您要实现的目标如下
max = a > b ? min = b, a : ( min = a, b );
尽管如果将此语句拆分为两个语句,代码将更具可读性
max = a > b ? a : b;
min = a > b ? b : a;
注意C和C++中复合运算符的定义是有区别的,C++中复合运算符的定义如下
conditional-expression:
logical-or-expression
logical-or-expression ? expression : assignment-expression
也就是说第三个操作数可以是一个赋值表达式。
例如在 C++ 你可以写
a < b ? max = b : max = a;
而在 C 中,这条语句看起来像
( a < b ? max = b : max ) = a;
并且编译器将发出一条错误消息,因为赋值的左操作数是rvalue
而不是lvalue
。
条件表达式的语法是:
条件表达式:
逻辑或表达式
逻辑或表达式?
表达式:
条件表达式
因此,由于运算符的优先级,您必须至少为第三个操作数使用括号。
此外,您的分配不正确。
这是修改后的版本:
#include <stdio.h>
int main() {
int a = 5;
int b = 7;
int max;
int min;
max = a > b ? min = b, a : (min = a, b);
printf("%d %d\n", min, max);
return 0;
}
Output: 5 7
为了避免编译器警告,你可以这样写:
max = a > b ? ((void)(min = b), a) : ((void)(min = a), b);
但是请注意,此方法非常不寻常、令人困惑且容易出错。 使用三元运算符一次只执行一个计算:
int max = (a > b) ? a : b; // max could even be declared as const int max = ...
int min = (a > b) ? b : a; // same for min
或者只使用if
语句:
if (a > b) {
max = a;
min = b;
} else {
max = b;
min = a;
}
C的用途很广……不是每一种可能性都被利用和滥用。 这里有一些更复杂的要避免的:
// recursive
*(a > (*(a > b ? &min : &max) = b) ? &max : &min) = a;
// symmetric
(min = a) < (max = b) || (max = a) > (min = b);
// compact
(min = max = a) > b ? (min = b) : (max = b);
这行不通吗?
(a < b) ? {min = a; max = b;} : {min = b; max = a;}
它并不漂亮,但通常你可以使用一个执行 scope 作为表达式参数,适用于 switch-case,我看不出它在这里不起作用的原因。
不要滥用条件运算符。 这样做只会使代码变得神秘。
相反,您可以使用 C 的固有值 1(真)和 0(假)。
这段代码看起来有点复杂,因为它有 3 个测试用例。 除了微小的数组pair
之外,它还可以直接转换为更简单的代码。
int main() {
int test[][2] = { { 5, 7 }, { 5, 5 }, { 5, 3 }, };
for( int i = 0; i < sizeof test/sizeof test[0]; i++ ) {
// two assignments, just like "int a = 5; int b = 7;"
int pair[2] = { test[i][0], test[i][1] };
// a conditional (stored for use)
int max = ( pair[0] < pair[1] );
// a print statement
printf( "%d %d\n", pair[!max], pair[max] );
}
return 0;
}
5 7
5 5
3 5
考虑在 6 个月或 6 年内阅读您的代码。 “我在想什么???”
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.