在许多语言中,条件分配是合法的。我从不了解背后的原因。你为什么写:
if (var1 = var2) {
...
}
代替:
var1 = var2;
if (var1) {
...
}
Answers:
对于循环而言,它比if语句更有用。
while( var = GetNext() )
{
...do something with var
}
否则必须写
var = GetNext();
while( var )
{
...do something
var = GetNext();
}
我发现它在经常涉及错误检测等操作的一系列动作中最有用。
if ((rc = first_check(arg1, arg2)) != 0)
{
report error based on rc
}
else if ((rc = second_check(arg2, arg3)) != 0)
{
report error based on new rc
}
else if ((rc = third_check(arg3, arg4)) != 0)
{
report error based on new rc
}
else
{
do what you really wanted to do
}
备选方案(不在条件中使用分配)是:
rc = first_check(arg1, arg2);
if (rc != 0)
{
report error based on rc
}
else
{
rc = second_check(arg2, arg3);
if (rc != 0)
{
report error based on new rc
}
else
{
rc = third_check(arg3, arg4);
if (rc != 0)
{
report error based on new rc
}
else
{
do what you really wanted to do
}
}
}
使用长时间的错误检查,替代方法可以在页面的RHS之外运行,而有条件分配版本则不能这样做。
错误检查也可能是“行动” - ,,first_action()
-当然,而不是仅仅检查。也就是说,可以检查该功能正在管理的过程中的步骤。(在我使用的代码中,大多数情况下,这些功能都是基于前提条件检查,或者是该功能正常工作所需的内存分配,或者类似的行为)。second_action()
third_action()
如果要调用一个函数,它会更有用:
if (n = foo())
{
/* foo returned a non-zero value, do something with the return value */
} else {
/* foo returned zero, do something else */
}
当然,您可以将n = foo();放进去。在一个单独的语句上,然后是(n),但我认为以上是一个易于理解的成语。
当您编写while
循环而不是if
语句时,该惯用法更为有用。对于if
声明,您可以按照描述将其分解。但是如果没有这种构造,您要么不得不重复自己:
c = getchar();
while (c != EOF) {
// ...
c = getchar();
}
或使用半个循环的结构:
while (true) {
c = getchar();
if (c == EOF) break;
// ...
}
我通常更喜欢半循环形式。
while
循环播放,请使用:do { c = getchar(); ... } while (c != EOF);
for
循环可以用来代替:for (char c = getchar(); c != EOF; c= getchar()) { /* do something with c */ }
-这是最简洁的,并且for
总是“循环”对我说,曲风。小缺点是您必须指定返回c
两次的函数。
我发现它对于返回可选值的函数(boost::optional
或std::optional
在C ++ 17中)非常有用:
std::optional<int> maybe_int(); // function maybe returns an int
if (auto i = maybe_int()) {
use_int(*i);
}
这样可以减小变量的范围,使代码更紧凑,并且不影响可读性(我发现)。
与指针相同:
int* ptr_int();
if (int* i = ptr_int()) {
use_int(*i);
}
原因是:
性能提升(有时)
更少的代码(总是)
举一个例子:有一个方法someMethod()
,在某种if
情况下您要检查该方法的返回值是否为null
。如果没有,您将再次使用返回值。
If(null != someMethod()){
String s = someMethod();
......
//Use s
}
由于您两次调用相同的方法,因此会降低性能。而是使用:
String s;
If(null != (s = someMethod())) {
......
//Use s
}