在这种情况下,多个条件运算符是个好主意吗?

Luc*_*cas 17 c c++ conditional-operator

我刚看到关于条件运算符的维基百科文章中的这段代码:

Vehicle new_vehicle = arg == 'B' ? bus      :
                      arg == 'A' ? airplane :
                      arg == 'T' ? train    :
                      arg == 'C' ? car      :
                      arg == 'H' ? horse    :
                      feet;
Run Code Online (Sandbox Code Playgroud)

我已经改变了一点代码,但想法是一样的.您会发现条件运算符的这种使用是否可以接受?它比if- elseconstruct 更简洁,并且使用一个开关肯定会为bug提供一整套新的机会(任何人都会堕落).此外,if- elses并且switch不能用作R值,因此您必须先创建变量,对其进行初始化,然后根据需要进行分配.

我真的很喜欢这个,但我想知道其他人的想法.

但格式化至关重要.

编辑:我还是喜欢这个.但我理解那些说" switch声明是为此做出的"的人.好吧,也许是这样.但是如果条件是返回的函数调用bool怎么办?或者其他一百万件你无法打开的东西.

你开关恋人真的试图说服我,一个巨大的if- else链比较好?是的,不知道如何使用条件运算符的程序员将无法理解这一点.他们应该学习如何使用它.这不是奥术.

Gra*_*row 33

我多次使用过这种结构.只要它的格式很好(即不是所有在一行上,使其不可读),我没有看到它的问题.


Jos*_*ger 31

我会使用一个开关,因为这是它的设计目的.是的,存在掉线错误的风险,但这种嵌套条件块有被其他程序员误解的风险要高得多.

  • 我会追加"......谁不理解或经常使用这个运营商" (11认同)
  • 我同意,不要害怕意外跌倒,这就像被躲避,因为你可能会意外地"挣脱"它. (5认同)
  • @Charles,我不会附加那个.拥有多个嵌套的条件运算符并不常见,上面的代码只能由于特殊的缩进和内嵌间距而可读.它会以另一种方式编写,还是以另一种方式显示,我相信它看起来会更复杂. (4认同)
  • @Johannes:我没有看到相关性.代码非常容易阅读.使用不同的格式肯定会难以阅读,但我也可以弄乱一个`switch`语句.@Josh:这不是`switch`语句的设计目的.如果是,那将是某种类似于操作符或函数的东西,并且会返回一个值. (4认同)
  • 有些情况下无法使用开关.例如,如果new_vehicle是引用,而不是Vehicle类的堆栈分配实例. (4认同)
  • @David,代码应该是可以理解的,无论缩进:您应该能够在需要时修复缩进,也可以在意外地某些制表符/空格不同步时.但是对于上面的代码,可读性和是否"理解"(实际上,我猜)它取决于缩进.例如,它被解析为`(arg =='B'?bus:arg =='A')?...`或解析如'arg =='B'?公共汽车:(arg =='A'?...)`?大多数人(包括我)都不会知道.这是邪恶的:我不想参考标准来理解基本的C++代码. (3认同)
  • @Johannes,*所有代码*只能由于特殊的缩进和内嵌间距而可读.由于链式三元运算符是一种罕见的视觉,这意味着格式通常差别很大,半标准的"标准"方式并没有真正达到群众. (2认同)

小智 14

这是条件运算符使用的一个很好的例子.我一直在C++,Java和Perl中以这种方式使用它.


Cha*_*ana 12

它不仅没有任何问题,它以最简洁明了的方式传达操作的意图.

用if else替换或切换构造需要该代码段

"new_vehicle =  "
Run Code Online (Sandbox Code Playgroud)

在每个实例中重复,这要求读者阅读它的每个重复实例,以确保它在每个实例中实际上是相同的.

  • 你把开关放在一个功能.如果你想在一个地方做这个操作,你很可能想在另一个地方做这个. (5认同)
  • 什么 !??然后,在函数中,在开关内部,你必须为开关内的每个案例重复一次"new_vehcle =".使用函数不会避免这种情况,它只是将它移动到函数中. (2认同)
  • 有关函数中的外观示例,请参阅我的答案."新车="部分只需要一次.是的,在函数中,我必须多次输入"return".但是如果我输入拼写错误并输入retrn,编译器会抓住我. (2认同)

Avi*_*Avi 11

我喜欢.它类似于if-else-if阶梯,只是更简洁.


aib*_*aib 11

字符常量周围有很多空格,这使得它有点难以阅读.我将比较括起来:(并且可能会移动最后一个值.)

Vehicle new_vehicle = (arg == 'B') ? bus      :
                      (arg == 'A') ? airplane :
                      (arg == 'T') ? train    :
                      (arg == 'C') ? car      :
                      (arg == 'H') ? horse    :
                                     feet;
Run Code Online (Sandbox Code Playgroud)

现在它看起来很棒.

  • 我是不必要的括号的忠实粉丝 - 即使在不太可能的情况下,这次我已经获得了运算符优先权,我无法保证下次我会正确读取它;-) (5认同)

Dav*_*ley 8

条件运算符版本干净,简单,对任何知道C或C++发生的事情的人来说都很明显.它的另一个优点是它立即返回一个值,这意味着它可以放在初始化中(如本例所示).

switch语句会更加笨拙.它需要声明变量然后初始化,如果可以避免则通常是个坏主意.这将需要更多的打字,并且会有更多的地方让虫子进入.它不会那么清楚,因为有必要看看每个案例,看它说的话new_vehicle = foo; break;.

如果你打算只在这里查看,那么条件版本就是好的,因为它会立即显示正在发生的事情.如果它不止一次发生,可以考虑将它放在一个函数中,这样只要有一个地方就可以更新(如运输'R'或直升机'L').

  • +1表示"对任何了解C或C++的人来说,这一点很明显." 任何不知道如何解析(格式良好且相对良性)的三元条件语句(或两个)的人都不知道C_并且可能缺少C++的很大一部分.你不会避免在你的代码中使用`malloc()`只是因为下一个出现的dope可能不理解指针和内存管理,对吗? (4认同)

小智 5

开关更清晰,效率更高.如果我在代码审查中看到这样的代码,我会担心的.此外,这是"条件运算符" - 它是三元运算符的一个实例(尽管目前是C和C++中唯一的实例).

  • 然后我会使用if-ladder,或者可能是函数的哈希映射值. (5认同)

Mor*_*hai 5

纯粹是一种风格选择.对于像你这样的小数据集,那么只要你的编程团队没有被这样的东西抛出,那么我的书就好了.


Pet*_*ore 5

Vehicle new_vehicle = getVehicleByType(arg);

Vehicle getVehicleByType(char arg){
  if (arg == 'B') return bus;
  if (arg == 'A') return airplane;
  if (arg == 'C') return car;
  if (arg == 'T') return train;
  if (arg == 'H') return horse;
  return feet;
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢这个.嵌套条件是聪明的,但我认为这几乎是简洁的,不太可能混淆未来的读者.对不起,如果语法关闭,我现在做的不多.

编辑:修复注释中注明的返回类型遗漏.谢谢!

编辑:顺便说一句,我对你的版本并不感到恐惧.当我看到它时,我并没有惊叹WTF或OMG.我只是更喜欢我的:)