我可以通过条件运算符执行多项任务吗?
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_operatorscanf("%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);
如您所见,非常容易阅读。更好地使用if
s
【讨论】:
Re "如您所见,非常容易阅读。",我认为您是在讽刺,但可以让它被阅读。大多数程序在将它们全部放在一行时看起来很糟糕,无论它们是否使用条件运算符。 是的——很容易看出这是讽刺。但重点是什么?不可读的代码和良好的外观让将来不得不调试的人 @ikegami 三元运算符的格式不友好。if
s 是。三元运算符并非设计用于携带复合语句,因此您的评论 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 )
这个宏会返回任何callFun
和callFun2
返回的东西,假设它们返回兼容的类型。
如果不是很明显,像这样的类似函数的宏是非常糟糕的做法,并且在可能的情况下总是首选实际函数。编写这样的宏应该是最后的手段,例如在维护一些您无法更改某些内容的糟糕代码库时。
【讨论】:
【参考方案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", &scanf)
你能解释一下吗?
@0___________,你问错人了;这是 OP 的代码。以上是关于我可以通过条件运算符执行多项任务吗?的主要内容,如果未能解决你的问题,请参考以下文章