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
- else
construct 更简洁,并且使用一个开关肯定会为bug提供一整套新的机会(任何人都会堕落).此外,if
- else
s并且switch
不能用作R值,因此您必须先创建变量,对其进行初始化,然后根据需要进行分配.
我真的很喜欢这个,但我想知道其他人的想法.
但格式化至关重要.
编辑:我还是喜欢这个.但我理解那些说" switch
声明是为此做出的"的人.好吧,也许是这样.但是如果条件是返回的函数调用bool
怎么办?或者其他一百万件你无法打开的东西.
你开关恋人真的试图说服我,一个巨大的if
- else
链比较好?是的,不知道如何使用条件运算符的程序员将无法理解这一点.他们应该学习如何使用它.这不是奥术.
Jos*_*ger 31
我会使用一个开关,因为这是它的设计目的.是的,存在掉线错误的风险,但这种嵌套条件块有被其他程序员误解的风险要高得多.
Cha*_*ana 12
它不仅没有任何问题,它以最简洁明了的方式传达操作的意图.
用if else替换或切换构造需要该代码段
"new_vehicle = "
Run Code Online (Sandbox Code Playgroud)
在每个实例中重复,这要求读者阅读它的每个重复实例,以确保它在每个实例中实际上是相同的.
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)
现在它看起来很棒.
条件运算符版本干净,简单,对任何知道C或C++发生的事情的人来说都很明显.它的另一个优点是它立即返回一个值,这意味着它可以放在初始化中(如本例所示).
switch语句会更加笨拙.它需要声明变量然后初始化,如果可以避免则通常是个坏主意.这将需要更多的打字,并且会有更多的地方让虫子进入.它不会那么清楚,因为有必要看看每个案例,看它说的话new_vehicle = foo; break;
.
如果你打算只在这里查看,那么条件版本就是好的,因为它会立即显示正在发生的事情.如果它不止一次发生,可以考虑将它放在一个函数中,这样只要有一个地方就可以更新(如运输'R'或直升机'L').
小智 5
开关更清晰,效率更高.如果我在代码审查中看到这样的代码,我会担心的.此外,这是"条件运算符" - 它是三元运算符的一个实例(尽管目前是C和C++中唯一的实例).
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.我只是更喜欢我的:)