三元运算符如何替换if-else条件

时间:2019-01-30 14:40:27

标签: c

请帮助我以更好的方式重写以下条件

这是C代码

 if(a == MACRO1)
 strcpy(x,"S")
else if (a == MACRO2)
 strcpy(x,"K");

6 个答案:

答案 0 :(得分:4)

if(a == MACRO1)
 strcpy(x,"S")
else 
 strcpy(x,"K");

可以是:

strcpy(x, (a == MACRO1) ? "S" : "K");

但是

if(a == MACRO1)
 strcpy(x,"S")
else if (a == MACRO2)
 strcpy(x,"K");

还有其他事情要做

strcpy(x, (a == MACRO1) ? "S" : ((a == MACRO2) ? "K" : x));

正确的,因为 strcpy 的参数不能重叠,但是在特定情况下,不能确定这是一个真正的问题(甚至是未定义的行为),但 > x 可能尚未初始化,性能如何...

答案 1 :(得分:4)

形式上,它可以等效地重写

a == MACRO1 ? strcpy(x, "S") : 
a == MACRO2 ? strcpy(x, "K") : 0;

,但没有有意义的理由这样做,除非这只是一个难题(或者除非有可信的理由maintain expression semantics)。

答案 2 :(得分:3)

撇开该beautiful answer,不能将其写为两个“嵌套”三元条件运算符,因为除了a和{{ 1}},并且不可能将MACRO1欺骗为无操作。 (将MACRO2复制到自身的行为是 undefined 。)

因此,最好保留原样的代码。请注意,就编程历史而言,三元条件运算符是在strcpy x控制块之前发明的,这可能是由于前者的缺陷,如您所呈现的情况所概括。

您可以提交

if

但是参加下一次混淆竞赛。

答案 3 :(得分:1)

strcpy( x, (a == MACRO1)? "S" :
           (a == MACRO2)? "K" : "error" );

就像您的原始代码一样,这会将"S""K"复制到变量x

如果a既不是 MACRO1也不是MACRO2,它将复制"error"到缓冲区{{1 }},并假设x足以容纳x字符串。
(您应该找出一种更好的方法来处理"error"既不是两个宏的情况)

答案 4 :(得分:-1)

也可以

{
    char *dummy;

    dummy = a == MACRO1 ? strcpy(x, "TextA") : a == MACRO2 ? strcpy(x, "TextB") : strcpy(x, "error");
}

答案 5 :(得分:-1)

最简单的方法,就像原始的一样,如果a与MACRO1或MACRO2不匹配,则不添加任何内容:

strcpy(x, (a == MACRO1)?"S":(a == MACRO2)?"K":x);