题
是否有从代码导致像
的任何理解/可维护性的问题inVar1 == 0 ? NULL : v.push_back(inVar1);
inVar2 == 0 ? NULL : v.push_back(inVar2);
和等等。
在可能会混淆的想法是使用用于节目流而不是变量赋值三元运算符,这是通常的解释。
我还没有看到的编码工作,解决这种用法,所以虽然我很舒服这样做,我想看看是否有一个很好的理由不这样做。
标准解决方案
我认为这是混乱和困难得多为比简单地输入读;
if (inVar != 0)
v.push_back(inVar);
我不得不扫描您的例子几次搞清楚,结果将是有把握的。我甚至宁愿单行如果(){}语句比你的例子 - 我恨单行if语句:)
其他提示
三元运算符是指返回一个值。
IMO,它不应该发生变异的状态,并且应当使用的返回值。
在另一种情况下,可使用if语句。如果语句意在执行代码集团。
在三元是一件好事,我一般促进它的使用。
你在做什么在这里玷污但是它的可信度。这是更短的,是的,但它是必要的复杂。
我认为这应该被避免。你可以使用一个1行if语句在它的地方。
if(inVar1 != 0) v.push_back(inVar1);
编译器,这些天将作出是否一样快三元运算符。
您的目标应该是多么容易是它的另一个软件开发者阅读。
我投
if ( inVar != 0 )
{
v.push_back( inVar );
}
为什么括号...因为有一天你可以把它放到别的东西在那里,括号内是为你预先完成。大多数编辑这些天就派他们无论如何。
您使用三元运算符的获得你什么,你伤害了代码的可读性。
由于三元运算符返回不使用它为奇数代码的值。使用一种if
的是更清楚在你们这样的情况。
如在评论中提到litb,此不有效的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
然而,可以围绕由铸造加工:
inVar1 == 0 ? (void)0 : v.push_back(inVar1);
inVar2 == 0 ? (void)0 : v.push_back(inVar2);
但代价是什么?和目的是什么?
它不喜欢使用这里的三元运算符是比任何在这种情况下if语句更简洁:
inVar1 == 0 ? NULL : v.push_back(inVar1);
if(inVar1 != 0) v.push_back(inVar1);
虽然,在实践中,我与那些谁阻止这种类型的写作的情感认同(阅读时,你必须做一些额外的工作来扫描表现为它的副作用的),我想提供
!inVar1 ?: v.push_back(inVar1);
!inVar2 ?: v.push_back(inVar2);
...如果你打算为晦涩,那是。 GCC允许x ?: y
到位x ? x : y
的。 : - )
我用三元运算符时,我需要调用一些功能,有条件的参数 - 在这种情况下,它是更好然后if
比较
printf("%s while executing SQL: %s",
is_sql_err() ? "Error" : "Warning", sql_msg());
与
if (is_sql_err())
printf("Error while executing SQL: %s", sql_msg());
else
printf("Warning while executing SQL: %s", sql_msg());
我觉得前者更有吸引力。而且它完全符合 DRY原则,不像后者 - 你不需要写两个几乎相同线。
我想你会做一个适当的结构是否得到更好的服务。我甚至喜欢总是有括号我如果结构,在事件中,我要稍后添加行的条件执行。
if (inVar != 0) {
v.push_back(inVar);
}
我认为有时三元是在对构造初始化列表必要的恶。我使用它们大多为在我想要分配内存和构造的主体之前在它设置一些指针点构造器。
一个例子,假设有你想有采取矢量作为输入,但内部表示的整数存储类是一个数组:
class foo
{
public:
foo(std::vector<int> input);
private:
int* array;
unsigned int size;
};
foo:foo(std::vector<int> input):size(input.size()), array( (input.size()==0)?
NULL : new int[input.size])
{
//code to copy elements and do other start up goes here
}
这是我如何使用三元运算。我不认为像有些人那样,但我认为应该限制他们使用多少它,它是混乱的。
最折磨ternaries的(是如何形成的头韵?)我看到的仅仅是在把真正属于逻辑if语句在一个if语句不属于或不能去的地方尝试。
例如:
if (inVar1 != 0)
v.push_back(inVar1);
if (inVar2 != 0)
v.push_back(inVar2);
作品假设v.push_back是无效的,但如果它的返回需要得到传递给另一个函数的值?在这种情况下,必须是这个样子:
SomeType st;
if (inVar1 != 0)
st = v.push_back(inVar1);
else if (inVar2 != 0)
st = v.push_back(inVar2);
SomeFunc(st);
但是,这是更消化这样一个简单的一段代码。我的解决办法:定义另一个功能
SomeType GetST(V v, int inVar1, int inVar2){
if (inVar1 != 0)
return v.push_back(inVar1);
if (inVar2 != 0)
return v.push_back(inVar2);
}
//elsewhere
SomeFunc(GetST(V v, inVar1, inVar2));
在任何情况下,问题是这样的:如果你有一些逻辑这太折磨了三元,但会弄乱你的代码,如果它放在一个if语句,把它放在别的地方
!inVar1 != 0 || v.push_back(inVar1);
inVar2 != 0 || v.push_back(inVar2);
在语言中出现如Perl共用图案。
如果你有一个或两个的tenary参数则其错误的多个方法调用。不管什么声明的所有代码行应该简短,最好不复杂。
一个适当的if语句是更具有可读性,如其他人提及。此外,当你通过与调试器单步执行代码,你会不会,如果当一切都在一个行将被能够很容易地看到其中的一个分支或者您使用的是三元表达式:
if (cond) doIt();
cond ? noop() : doIt();
而下面是好得多到步骤通过(你是否有括号或不):
if (cond) {
doIt();
}
如所提到的,这是不大于1行if语句更短或更清晰。然而,它也不再 - 而不是真的那么难神交。如果你知道三元运算符,这是很明显发生了什么。
毕竟,我不认为任何人都会有一个问题,如果它被分配给一个变量(即使它变异状态为好):
var2 = inVar1 == 0 ? NULL : v.push_back(inVar1);
这三元运算符总是返回一个值的事实 - IMO - 是无关紧要的。肯定有你使用所有的返回值没有要求......毕竟,分配返回值。
话虽这么说,我会用if语句来替换它,如果我碰到它跑了一个空分支。
但是,如果更换了3行,如果语句:
if (inVar == 0) {
v.doThingOne(1);
} else {
v.doThingTwo(2);
}
使用:
invar1 == 0 ? v.doThingOne(1) : v.doThingTwo(2);
我的可能的离开它...这取决于我的心情。 ;)