在 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);

我想对这些数字进行排序并将它们分配给变量最大值或最小值。 是否可以告诉程序,如果 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;

因此,变量maxb设置为变量的不确定值min如果大于ab,否则设置为变量的值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 年内阅读您的代码。 "我在想什么???">

相关内容

  • 没有找到相关文章

最新更新