这是三元运算符的合理使用吗?

use*_*572 7 c c# c++ ternary

是否有像代码那样的理解/可维护性问题

inVar1 == 0 ? NULL : v.push_back(inVar1);
inVar2 == 0 ? NULL : v.push_back(inVar2);
Run Code Online (Sandbox Code Playgroud)

等等.

可能令人困惑的想法是使用三元运算符来进行程序流而不是变量赋值,这是通常的解释.

我没有看到解决这种用法的工作中的编码标准,所以虽然我很乐意这样做,但我想知道是否有充分的理由不这样做.

And*_*ant 35

我认为阅读比单纯打字更令人困惑和困难;

if (inVar != 0)
  v.push_back(inVar);
Run Code Online (Sandbox Code Playgroud)

我不得不多次扫描你的例子,以确定结果会有什么确定性.我甚至更喜欢单行if(){}语句而不是你的例子 - 我讨厌单行if语句:)


thi*_*ing 25

三元运算符旨在返回一个值.

IMO,它不应该改变状态,并且应该使用返回值.

在另一种情况下,使用if语句.如果语句是为了执行代码块.


dic*_*oce 11

三元是一件好事,我通常会推广它的用法.

你在这里所做的事情却玷污了它的可信度.它更短,是的,但它不必要地复杂化.


Bil*_*ard 10

我认为应该避免这种情况.您可以在其位置使用1行if语句.

if(inVar1 != 0) v.push_back(inVar1);
Run Code Online (Sandbox Code Playgroud)

  • @mP:你不必盲目地遵循编码惯例而不考虑*为什么它们存在.你并不总是需要围绕每个if块. (5认同)
  • @mP:有:懒惰,有时甚至是可读性; 我经常做`if(!buffer)返回NULL;`来检查返回值/错误条件,如果*不*被大括号包围,我发现它更容易阅读,与一些编码约定可能会说的无关. . (3认同)

Gre*_*ndt 6

这些天的编译器会像三元运算符一样快.

您的目标应该是让其他软件开发人员阅读起来有多容易.

我投票支持

if ( inVar != 0 )
{
   v.push_back( inVar );
}
Run Code Online (Sandbox Code Playgroud)

为什么括号...因为有一天你可能想在那里放一些其他的东西,并且为你预先设置了括号.如今,大多数编辑都会把它们放进去.


lil*_*llq 6

您使用三元运算符无需任何操作,并且会损害代码的可读性.

由于三元运算符返回一个你不使用的值,因此它是奇数代码.使用的if是像你这样的情况下,更清晰.


bk1*_*k1e 5

正如评论中提到的那样,这不是有效的C++.例如,GCC将在此代码上发出错误:

error: `(&v)->std::vector<_Tp, _Alloc>::push_back [with _Tp = int, _Alloc =
std::allocator<int>](((const int&)((const int*)(&inVar1))))' has type `void' 
and is not a throw-expression
Run Code Online (Sandbox Code Playgroud)

但是,这可以通过强制转换来解决:

inVar1 == 0 ? (void)0 : v.push_back(inVar1);
inVar2 == 0 ? (void)0 : v.push_back(inVar2);
Run Code Online (Sandbox Code Playgroud)

但是以什么代价?为了什么目的?

在这种情况下,这不像使用三元运算符更简洁而不是if语句:

inVar1 == 0 ? NULL : v.push_back(inVar1);
if(inVar1 != 0) v.push_back(inVar1);
Run Code Online (Sandbox Code Playgroud)