请帮助我以更好的方式重写以下条件
这是C代码
if(a == MACRO1)
strcpy(x,"S")
else if (a == MACRO2)
strcpy(x,"K");
答案 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);