在許多語言中,作業在條件下是合法的。我從未理解這背後的原因。爲什麼你會寫:爲什麼你會在條件中使用任務?
if (var1 = var2) {
...
}
代替:
var1 = var2;
if (var1) {
...
}
在許多語言中,作業在條件下是合法的。我從未理解這背後的原因。爲什麼你會寫:爲什麼你會在條件中使用任務?
if (var1 = var2) {
...
}
代替:
var1 = var2;
if (var1) {
...
}
它比循環語句更有用。
while(var = GetNext())
{
...do something with var
}
,否則必須寫入
var = GetNext();
while(var)
{
...do something
var = GetNext();
}
如果你調用返回要麼數據上工作的功能或一個標誌,指示錯誤它可能是有用的(或你完成了)。
喜歡的東西:
while ((c = getchar()) != EOF) {
// process the character
}
// end of file reached...
個人這是一個成語,我不喜歡巨大的,但有時選擇是醜陋。
它,如果你調用一個函數更爲有用:
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),但我認爲上面是一個相當可讀的習慣用法。
我想你應該括在括號或GCC會抱怨有: 警告:建議用作真值的賦值語句前後括號[-Wparentheses] 像這樣: IF((N =(foo())){ //做一些返回值 } else { // foo返回零/ NULL,做別的事 } – 2015-07-17 12:41:37
當您編寫while
循環而不是if
語句時,該成語更有用。對於if
聲明,您可以按照您的描述將其分解。但是,如果沒有這個結構,你要麼不得不重複自己:
c = getchar();
while (c != EOF) {
// ...
c = getchar();
}
或使用循環和半結構:
while (true) {
c = getchar();
if (c == EOF) break;
// ...
}
我通常喜歡環路和A-一半的形式。
GCC可以幫助您檢測(用-Wall),如果你無意中嘗試使用賦值爲真值,如果它建議你寫
if ((n = foo())) {
...
}
即使用額外的括號來表明這真的是你想要的。
在PHP中,例如,它是有用的,通過SQL數據庫結果循環:
while ($row = mysql_fetch_assoc($result)) {
// Display row
}
這看起來不過如此:
$row = mysql_fetch_assoc($result);
while ($row) {
// Display row
$row = mysql_fetch_assoc($result);
}
我發現它通常涉及錯誤檢測等行爲鏈條中最有用。
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不這樣做。
簡短的回答是,編程語言允許更簡潔的代碼。不要強迫你separate commands from queries。
另一個優點是在gdb的使用過程中。 在以下代碼中,如果我們要單步執行,則不知道錯誤代碼。
while (checkstatus() != -1) {
// process
}
而是
while (true) {
int error = checkstatus();
if (error != -1)
// process
else
//fail
}
現在在足下,我們可以知道什麼是從的checkStatus返回錯誤代碼()。
的原因是:
性能改進(有時)
小碼(始終)
以一個例子:有一個方法someMethod()
並在if
您要檢查該方法的返回值是否爲null
。如果不是,你將再次使用返回值。
If(null != someMethod()){
String s = someMethod();
......
//Use s
}
由於您調用同一方法兩次,它會妨礙性能。而是使用:
String s;
If(null != (s = someMethod())) {
......
//Use s
}
我同意 - 但會寫:while((var = GetNext() )!= 0){...}不用兩次思考,部分原因是GCC抱怨如果我沒有使用我的默認編譯選項。 – 2008-10-08 22:08:47
是的。假設您正在使用支持for-loop聲明的語言,並且您尚未在循環之外使用var。 – Gerald 2012-10-24 16:02:51
在某些語言中,如ANSI C,作用域規則不允許使用這種方法,@KerrekSB – wirrbel 2013-10-09 16:30:18