是否可以写出等效化合物"如果"声明使用"?" C中的运算符?我想写一个" if - else if - else"声明并且想知道我是否可以使用"?"操作
我相信使用"?"的常规语法就像
foo = (bar == 42) ? answerToEverything : useless;
如果我想使用"?"在一行中重写以下语句?操作员,我可以这样做吗?怎么样?
if(bar == 42) {
foo = answerToEverything;
}
else if(bar == 23) {
foo = bigMike;
}
else foo = useless;
答案 0 :(得分:13)
foo =
(bar == 42) ? answerToEverything :
(bar == 23) ? bigMike :
useless;
答案 1 :(得分:6)
我建议使用多行表单,因为它更容易理解:
if (bar == 42) {
foo = answerToEverything;
} else if (bar == 23) {
foo = bigMike;
} else {
foo = useless;
}
但是,如果你真的想让你的代码难以阅读:
foo = (bar == 42)
? answerToEverything
: (bar == 23)
? bigMike
: useless;
当然,您可以随意使用空格进行格式化。
答案 2 :(得分:4)
是的,你可以这样做,如下所示。
但是,嵌套条件运算符通常被认为是不好的样式。这可能会损害可读性。
foo = (bar == 42)
? answerToEverything
: ((bar==23) ? bigMike : useless );
答案 3 :(得分:2)
是的。你可以在尾部堆叠三元运算符表达式:
foo = (bar == 42) ? answerToEverything : ( (bar==23) ? bigMike : useless);
但是,当然,可读性是最重要的,所以你可能更好地使用if语句,如果可能的话,甚至可以更好地使用switch-case语句:
switch (bar) {
case 42: foo = answerToEverything; break;
case 23: foo = bigMike; break;
default: foo = useless;
}
答案 4 :(得分:2)
您已经收到了几个正确的答案,但到目前为止发布的所有答案都包含过多的()
。 (有趣的是,他们的作者大胆地放弃了整个嵌套()
运算符周围的?:
,但羞怯地坚持()
围绕==
比较。我自己,我有关于抛弃前者比后者更多的怀疑。)无论如何,既然我们已经试图在优先权和关联性风险方面生活在边缘,这是我的版本
foo =
bar == 42 ? answerToEverything :
bar == 23 ? bigMike :
useless;
通过?:
运算符实现它的一个[次要]问题是,通常您将无法看到在逐步调试器中采用的路径。大多数(如果不是全部)调试器会将上述内容视为原子操作并在一步中执行。 (更确切地说,大多数编译器将生成调试信息,将其视为原子操作。)使用if-ladder方法,您将明确地看到采用的路径。
答案 5 :(得分:1)
如果我理解你的问题,那么是有一个嵌套的三元组,比如
foo = (bar == 42) ? answerToEverything : ((bar == 23) ? bigMike : useless);
请注意,我不建议您使用嵌套的三元组 - 它很难阅读。
答案 6 :(得分:0)
你可以使用复合?:声明。
像前面的代码一样,可能如下:(bar == 42) ? (foo = answerToEverything): ((bar == 23) ? (foo = bigMike) : (foo = useless));
答案 7 :(得分:0)
我相信这应该做你想要的。它基本上是两个复合if语句的组合。如果第一个评估为假,则仅评估第二个。
foo = (bar == 42) ? "answerToEverything" : ((bar == 23) ? "bigMike" : "useless");
我在一个在线编译器中运行它,并使foo成为一个字符串并禁止一个int,它的行为符合预期。