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

C++ C中使用?:运算符的复合if语句,c++,c,if-statement,syntax,ternary-operator,C++,C,If Statement,Syntax,Ternary Operator,是否可以使用C中的“?”运算符编写等效复合“if”语句?我想写一个“if-else if-else”语句,不知道是否可以使用“?”操作符 我相信使用“?”的常规语法应该是 foo = (bar == 42) ? answerToEverything : useless; 如果我想用“?”运算符在一行中重写下面的语句,我可以这样做吗?怎么做 if(bar == 42) { foo = answerToEverything; } else if(bar == 23) { foo = bi

是否可以使用C中的“?”运算符编写等效复合“if”语句?我想写一个“if-else if-else”语句,不知道是否可以使用“?”操作符

我相信使用“?”的常规语法应该是

foo = (bar == 42) ? answerToEverything : useless;
如果我想用“?”运算符在一行中重写下面的语句,我可以这样做吗?怎么做

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

是的,您可以这样做,如下所示

然而,嵌套条件运算符通常被认为是不好的样式。这可能会损害可读性

foo = (bar == 42) 
  ? answerToEverything
  : ((bar==23) ? bigMike : useless );
是的,你可以,但这很难看,很难理解! 我建议使用多行表单,因为它更容易理解:

if (bar == 42) {
  foo = answerToEverything;
} else if (bar == 23) {
  foo = bigMike;
} else {
  foo = useless;
}
但是,如果您真的想让代码难以阅读:

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

当然,您可以随意使用您认为合适的空白格式。

确实如此。只需将三元运算符表达式堆叠在尾部即可:

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;
}

您可以使用复合?:语句

与前面的代码类似,可以是以下代码:

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

如果我理解你的问题,那么是的,用嵌套的三元组,比如

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

请注意,我不建议您使用嵌套三元-这很难阅读。

您已经收到了几个正确答案,但到目前为止发布的所有答案都包含过多的
()
。(非常有趣的是,他们的作者大胆地放弃了整个嵌套的
):操作符,但不好意思地坚持在
==
比较中保留
)。我自己对放弃前者比放弃后者更怀疑。)无论如何,由于我们已经试图在优先权和关联性风险方面处于边缘,下面是我的版本

foo = 
  bar == 42 ? answerToEverything :
  bar == 23 ? bigMike :
  useless;

通过
?:
操作符实现它的一个[次要]问题是,通常您无法看到在逐步调试程序中采用的路径。大多数(如果不是全部的话)调试器会将上述操作视为一个原子操作,并在一个步骤中执行。(更准确地说,大多数编译器将生成调试信息,并将其视为原子操作。)使用if-ladder方法,您将明确看到所采用的路径。

我认为这应该满足您的要求。它本质上是组合两个复合if语句。只有在第一个值为false时,才会对第二个值进行计算

foo = (bar == 42) ? "answerToEverything" : ((bar == 23) ? "bigMike" : "useless");

我在一个在线编译器中运行了这个程序,将foo设置为字符串,bar设置为int,它的行为符合预期。

(bar==42)?foo=回答所有问题:(bar==23)?foo=bigMike:foo=无用
我认为嵌套三元运算符有点难看。我也同意@Ben的观点。使用条件运算符(通常被混淆为“三元运算符”)编写它的目的是什么?为什么不使用
switch
语句?我会说“为什么要重写它?”三元运算符机制在一些情况下很方便,因为它隐藏了您不需要担心的细节,但是,在其使用存在任何复杂性的地方使用它,太容易导致混淆和bug。只要对三元数说“不!”就行了。@Ben:我通常在希望
foo
为常量,并且希望包含结果的代码具有空间局部性时使用此选项。@Ben:我还认为其他答案的代码格式非常糟糕。如果我像他们那样格式化它,我就不会使用它。@Ben:我是三元运算符的粉丝,但嵌套它肯定会让你将来迷惑自己,激怒你的同事+1来证明正确的格式很重要。不这样做的原因是它隐藏了存在的嵌套,您仍然需要“解析”它才能理解它。使用嵌套的ifs,您的眼睛可以在开始查看细节之前为您“解析”结构(如果格式合理)。我的意思是,上面的看起来很“整洁”,但是,老实说,你真的能看看它并告诉它是什么吗?像sharth演示的更好的格式使它更漂亮。我认为上面的格式比sharth的好,因为它实际上揭示了结构,而sharth的隐藏了它。格式化的目的不是为了看起来漂亮,而是为了使结构更清晰。示例代码似乎与@sharth之前的漂亮答案相同,但删除了围绕条件的偏执。偏执论对于人类的可视分组是有价值的,即使它们对于编译器来说不是必需的。我个人觉得沙斯的版本更具可读性。@Andythonas:我个人对这个答案投了赞成票。加上第二段,我的支持率更高。@Andy Thomas:@sharth答案正是我偷了代码原始版本的地方。请注意,我无意声称我的版本“更好”或“更正确”。我只是想另外说明一个事实,即比较周围的
()
是过度的。然而,在这种特殊情况下(即
?:
操作符的比较部分),我个人确实认为过多的
()
是令人讨厌的,没有它的代码读起来更好(只要格式正确)。我来晚了……嵌套的三元语句——这是我见过的最华丽的语法。感谢您使用
switch
语句对此进行解释。嵌套的三元数是否比开关快?@Chris22这将最终取决于您的特定情况以及编译器如何对其进行优化。通常,包含许多
case
子句的
switch
语句是通过查找表而不是穷举检查来实现的。如果这里的表演真的很重要,请考虑测量两者之间的差异。谢谢,我一定要测量两者之间的差异。我这样问是因为
开关
通常比较长的
I列表要快
foo = (bar == 42) ? "answerToEverything" : ((bar == 23) ? "bigMike" : "useless");