复合if语句在C中使用?:运算符

时间:2014-07-31 16:56:23

标签: c++ c if-statement syntax ternary-operator

是否可以写出等效化合物"如果"声明使用"?" C中的运算符?我想写一个" if - else if - else"声明并且想知道我是否可以使用"?"操作

我相信使用"?"的常规语法就像

foo = (bar == 42) ? answerToEverything : useless;

如果我想使用"?"在一行中重写以下语句?操作员,我可以这样做吗?怎么样?

if(bar == 42) {
  foo = answerToEverything;
} 
else if(bar == 23) {
  foo = bigMike;
} 
else foo = useless;

8 个答案:

答案 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,它的行为符合预期。