繁体   English   中英

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

[英]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 ,则变量maxb被设置为变量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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM