在 C 中的三元运算符内使用多个指令

问题描述 投票:0回答:5

我是学习 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 = 最小值);

c conditional-operator operator-precedence comma-operator
5个回答
4
投票

您的作业 (

=
) 和逗号运算符 (
,
) 已向后。 但正如评论中所建议的那样,这是晦涩难懂的并且不必要地难以阅读。 只需写一个
if
声明即可:

int a = 5;
int b = 7;
int max;
int min;

if(a>b){
    max=a;
    min=b;
}else{
    max=b;
    min=a;
}

使用三元运算符并不是一个坏习惯,但要避免使用它来执行这样的多个操作。不要仅仅因为可以就将其视为

if
的某种内联替代品。

对逗号运算符 (

,
) 的建议更普遍的是避免使用它。 它是多余的,容易出错,并且可能与函数调用和声明中的逗号分隔符混淆。


2
投票

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


1
投票

条件表达式的语法为:

条件表达式:
逻辑或表达式
逻辑或表达式 ?

 
表达式 :
 
条件表达式

因此,由于运算符优先级,您必须至少对第三个操作数使用括号。

此外,你的作业也不正确。

这是修改后的版本:

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

0
投票
这不起作用吗?

(a < b) ? {min = a; max = b;} : {min = b; max = a;}
它并不漂亮,但通常你可以使用执行范围作为表达式参数,适用于 switch-case,我认为它没有理由在这里不起作用。


0
投票
不要滥用条件运算符。这样做只会让代码变得神秘。

相反,您可以使用 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 年内阅读你的代码。 “我在想什么???”

© www.soinside.com 2019 - 2024. All rights reserved.