我是学习 C 的新手,我想知道是否可以在 C 中的三元运算符内启动多个指令 - 例如:
int a = 5;
int b = 7;
int max;
int min;
max = (a>b) ? a, b = min : b, a = min;
printf("%d %d", min, max);
我想对这些数字进行排序并将它们分配给变量 max 或 min。 是否可以告诉程序如果 a > b 则将 a 保存为最大值并将 b 指定为最小值?或者我必须使用 If 函数来做到这一点? 我认为问题在于使用逗号,但我不知道应该使用什么。 我收到的消息是这样的:
警告:逗号运算符的左操作数无效 [-Wunused-value] int 最大值 = (a>b) ? (a,b = 最小值):(b,a = 最小值);
您的作业 (
=
) 和逗号运算符 (,
) 已向后。
但正如评论中所建议的那样,这是晦涩难懂的并且不必要地难以阅读。
只需写一个if
声明即可:
int a = 5;
int b = 7;
int max;
int min;
if(a>b){
max=a;
min=b;
}else{
max=b;
min=a;
}
使用三元运算符并不是一个坏习惯,但要避免使用它来执行这样的多个操作。不要仅仅因为可以就将其视为
if
的某种内联替代品。
对逗号运算符 (
,
) 的建议更普遍的是避免使用它。
它是多余的,容易出错,并且可能与函数调用和声明中的逗号分隔符混淆。
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;
因此,如果
max
大于 b
,则变量 min
和 a
被设置为变量 b
的不确定值,否则设置为变量 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;
}
输出: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;}
它并不漂亮,但通常你可以使用执行范围作为表达式参数,适用于 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 年内阅读你的代码。 “我在想什么???”