我可以通过条件运算符执行多项任务吗?

Posted

技术标签:

【中文标题】我可以通过条件运算符执行多项任务吗?【英文标题】:Can i do Multiple tasks by the conditional operator? 【发布时间】:2022-01-21 03:51:24 【问题描述】:

我们可以在条件运算符中写多个命令吗? (为了知识,不是为了使用)

    if (x == 1) 
        printf("Printf");
        scanf("%d", &scanf);
        callFun(calling a function);
    
    else if (x == 2) 
        printf("Printf2");
        scanf("%d", &scanf2);
        callFun2(calling a function);
    

【问题讨论】:

en.wikipedia.org/wiki/Comma_operator scanf("%d", &scanf);你能告诉我用例吗? 你想达到什么目的? Can i do Multiple tasks ... 定义任务,你可以编译这行代码(如答案中的@0所示)只要你能将它们分开用逗号作为表达式,但会因为 (x == 1) ? return 0 : ...(x == 1) ? goto fail : ... 之类的语句而失败 这个问题我完全不清楚。请改写,或提供一个与您想要实现的目标相近的综合示例。 【参考方案1】:
int foo(int x)

    int g,h;
    (void)( x == 1 ? ( printf("Hello\n"), scanf("%d", &g), callfunc(g)) : x == 2 ? ( printf("Hello2\n"), scanf("%d", &k), callfunc(h + 5)) : 0);

如您所见,非常容易阅读。更好地使用ifs

【讨论】:

Re "如您所见,非常容易阅读。",我认为您是在讽刺,但可以让它被阅读。大多数程序在将它们全部放在一行时看起来很糟糕,无论它们是否使用条件运算符。 是的——很容易看出这是讽刺。但重点是什么?不可读的代码和良好的外观让将来不得不调试的人 @ikegami 三元运算符的格式不友好。 ifs 是。三元运算符并非设计用于携带复合语句,因此您的评论 IMO 被认为不太好。 @0___________,我同意您通常可以通过避免它来获得更清晰的代码。但它不可读是你的错。 让审阅者/维护者理解代码是否更重要【参考方案2】:

我认为这看起来很干净

#include <stdio.h>

void func()
    puts("working");

void func1()
    puts("working 2");


int main()
    int i = 21;
    i == 2122 ? func() : func1();
    return 0;

这也有效

int main()
    int i = 21;
    i == 2122 ? (
            puts("working 1"),
            puts("working 2")
            ) : (
                puts("working 3"),
                puts("working 4"));
    return 0;

【讨论】:

我终于明白CLISP是什么意思了:)【参考方案3】:

?: 不如if 通用,因为它需要表达式的操作数。此外,它要求两个操作数的类型相同。在某些情况下,当它们不是时,C 隐式地尝试通过在第二个和第三个操作数上应用隐式的“通常的算术转换”来转换它们。这可能会导致意想不到的结果。例如这段代码会打印乱码:

printf("%d\n", 1 ? 1 : 1.0);

即使从未计算过第 3 个操作数,第 2 个操作数也会被隐式提升为 double 并使用 %d 打印会产生未定义的行为。

为了避免这种微妙的事情,?: 应该在大多数时候被避免。它在 C 语言中的主要目的实际上是在返回值的类似函数的宏中启用条件。例如,我们显然不能编写返回这样的值的宏:

#define M(cond) if(cond)  foo();  else  bar();  

但也可以这样:

#define M(cond) ( (cond) ? foo() : bar() )

同样,, 逗号运算符的主要目的也是启用此类宏。所以是的,您可以重写您使用?: 结合逗号运算符编写的代码。但这是一个非常糟糕的主意,因为这样的代码变得不可读。 可能唯一合理的地方是在类似函数的宏中:

#define M(x) ( x==1 ? (printf("Hello\n"),  scanf("%d", &something), callFun(something))  \
             : x==2 ? (printf("Hello2\n"), scanf("%d", &something), callFun2(something)) \
             : 0 )

这个宏会返回任何callFuncallFun2 返回的东西,假设它们返回兼容的类型。

如果不是很明显,像这样的类似函数的宏是非常糟糕的做法,并且在可能的情况下总是首选实际函数。编写这样的宏应该是最后的手段,例如在维护一些您无法更改某些内容的糟糕代码库时。

【讨论】:

【参考方案4】:

这样做会很奇怪,因此是不受欢迎的,但可以做到。

关键是使用逗号运算符而不是单独的语句。

(
   x == 1 ? (
      printf("Printf"),
      scanf("%d", &scanf),
      callFun(calling a function)
   )
   : x == 2 ? (
      printf("Printf2"),
      scanf("%d", &scanf2),
      callFun2(calling a function)
   )
   : (void)0
);

【讨论】:

scanf("%d", &amp;scanf)你能解释一下吗? @0___________,你问错人了;这是 OP 的代码。

以上是关于我可以通过条件运算符执行多项任务吗?的主要内容,如果未能解决你的问题,请参考以下文章

我可以在 [ngClass] 中使用条件(三元)运算符以及 Angular2 中的多个类条件吗?

我可以在 C 中使用位运算符而不是条件运算符吗? [复制]

我可以简化这个使用逻辑否定运算符的条件语句吗?

JavaScript 三元运算符可以支持 3 个条件吗?

Javascript 中的条件运算符

有人可以解释为啥条件运算符和赋值运算符一起使用时表现奇怪吗?