在许多语言中,作业在条件上是合法的.我从来不明白这背后的原因.你为什么要写:
if (var1 = var2) { ... }
代替:
var1 = var2; if (var1) { ... }
Gerald.. 105
它比if语句更有用于循环.
while( var = GetNext() ) { ...do something with var }
否则必须写
var = GetNext(); while( var ) { ...do something var = GetNext(); }
我同意 - 但会写:while((var = GetNext())!= 0){...}没有考虑过两次,部分是因为GCC抱怨如果我不使用我的默认编译选项. (13认同)
@wirrbel:你的意思是1989年的ANSI C?就像他们有蒸汽机和打卡牌一样?可能是这种情况,但这是相关的吗? (6认同)
这个警告不是因为一段时间内任务有任何问题,而是因为当你真正打算进行比较时做一项任务是一个常见的错误.如果你想摆脱警告,你可以做JS @Jonathan Leffler建议的等价物.就个人而言,我可能会这样做,因为我多么不信任JavaScript truthy规则:)还应该注意在某些语言如C#和Java这是唯一的方法. (3认同)
Jonathan Lef.. 31
我觉得它在行动链中最有用,通常涉及错误检测等.
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,而条件分配版本不会这样做.
它比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,而条件分配版本不会这样做.
如果你正在调用一个函数,它会更有用:
if (n = foo()) { /* foo returned a non-zero value, do something with the return value */ } else { /* foo returned zero, do something else */ }
当然,你可以把n = foo(); 在一个单独的声明然后if(n),但我认为上面是一个相当可读的习语.
如果您正在调用返回要处理的数据的函数或指示错误的标志(或您已完成),那么它将非常有用.
就像是:
while ((c = getchar()) != EOF) { // process the character } // end of file reached...
就个人而言,这是一个我不太喜欢的习语,但有时替代方案更加丑陋.
如果您无意中尝试将赋值用作真值,GCC可以帮助您检测(使用-Wall),以防它建议您编写
if ((n = foo())) { ... }
即使用额外的括号表示这确实是你想要的.
当你编写while
循环而不是if
语句时,这个习惯用法更有用.对于if
声明,您可以按照描述进行分解.但是如果没有这种结构,你要么必须重复自己:
c = getchar(); while (c != EOF) { // ... c = getchar(); }
或使用循环结构:
while (true) { c = getchar(); if (c == EOF) break; // ... }
我通常更喜欢循环半形式.