请帮助我以更好的方式重写以下条件
这是一个 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;
但是没有有意义的理由这样做,除非它只是一个谜题(或者除非有可信的理由来维护表达式语义)。
撇开这个美丽的答案不谈,这不能写成两个"嵌套"的三元条件运算符,因为除了MACRO1
和MACRO2
之外,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);