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



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

这是一个 c 代码

 if(a == MACRO1)
 strcpy(x,"S")
else if (a == MACRO2)
 strcpy(x,"K");
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可能尚未初始化,那么性能呢?

形式上,它可以重写为等效的

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

但是没有有意义的理由这样做,除非它只是一个谜题(或者除非有可信的理由来维护表达式语义)。

撇开这个美丽的答案不谈,这不能写成两个"嵌套"的三元条件运算符,因为除了MACRO1MACRO2之外,a的任何值都无事可做,而且不可能欺骗strcpy进入无操作。(将x复制到自身的行为是不确定的。

因此,您最好保持代码原样。请注意,就编程历史而言,三元条件运算符是在if else控制块之前发明的,这可能是由于前者的缺陷,正如您介绍的情况所体现的那样。

您可以提交

strnpcy(x, a == MACRO1 ? "S" : "K", 2 * (a == MACRO1 + a == MACRO2));

不过,到下一个混淆比赛。

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

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

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

也可以

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

最简单的方法,表现得像原始的,如果 a 与 MACRO1 或 MACRO2 不匹配,则不附加任何内容:

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

最新更新