我是学习 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);
我想对这些数字进行排序并将它们分配给变量最大值或最小值。 是否可以告诉程序,如果 a> b,它将保存 a 作为最大值并将 b 分配给最小值?还是我必须使用 If 函数来执行此操作? 我认为问题在于使用逗号,但我不知道应该使用什么。 我得到的消息是这样的:
警告:逗号运算符的左操作数不起作用 [-Wunused-value] 整数最大值 = (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
的某种内联替代方案。
逗号运算符(,
)的建议是更普遍地避免它。 它是多余的,容易出错,并且可能会与函数调用和声明中的逗号分隔符混淆。
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 %dn", 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;}
它并不漂亮,但通常您可以使用执行范围作为表达式参数,适用于开关大小写,我认为没有理由在这里不起作用。
不要滥用条件运算符。这样做只会使代码变得神秘。
相反,您可以使用 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 %dn", pair[!max], pair[max] );
}
return 0;
}
5 7
5 5
3 5
考虑在 6 个月或 6 年内阅读您的代码。 "我在想什么???">