[英]Assign and compare in a single statement in C
如何將以下代碼轉換為一行?
int *i;
i = some_func_ret_int_ptr();
if(!i)
{
// Do something
}
// Will use 'i' later
我想做類似的事情:
if((i=some_func_ret_int_ptr) && !i)
{
// Do something
}
// Will use 'i' later
但我在這里浪費了一個比較。 有沒有更好的方法來做到這一點?
我想要的只是if
中的賦值和比較,並且僅比較i
。
使用 C,這是您可以打高爾夫球的范圍:
int *i;
if(!(i = some_func_ret_int_ptr()))
{
// do something
}
// Will use i later
除了其他答案中建議的內容外,您還可以這樣做
if (i = some_func_ret_int_ptr(), !i)
{
// Do something
}
它是您最初的文字實現,語句序列替換為由,
運算符分隔的表達式序列。
不過,這沒有多大實際意義。
你可以做
if(!(i = some_func_ret_int_ptr()))
{
...
}
這段代碼中發生的事情依次是:
some_func_ret_int_ptr()
的返回值賦值給i
!i
被檢查i == 0
if
里面的東西被執行,否則它不會干凈易讀:
int * i = some_func_ret_int_ptr();
if (!i) { /* ... */ }
尚未提及的選項是:
if ( NULL != (i = some_func()) )
使用對NULL
的顯式比較可以很容易地閱讀此代碼的意圖。 特別是考慮到您的函數可能不會在其名稱中包含ret_int_ptr
。
使用#include <ctype.h>
標准庫,要獲取toupper(char)
函數,我們可以編寫以下函數:
void StringToUppercase(char* str)
{
for (int i=0; (str[i] = toupper(str[i])) != 0; i++); // No for-loop body!
// The expression "(str[i] = toupper(str[i]))" executes first and then returns str[i]
}
這樣語句(str[i] = toupper(str[i])) != 0;
兩者都分配一個字符並檢查它是否為'\\0'
。
它的工作方式是 C 語言的一部分指定賦值表達式在賦值之后具有左側表達式的值。 例如,對於整數,請考慮以下代碼片段:
int x = 5;
int y = x = 8;
// Assignment operators (= += <<=) have right-to-left associativity.
// The expression `(x=8)` returns the value 8, after it has been executed
int z = x != y; // Comparisons have greater (tighter) precedence than assignment
printf("(x, y, z) = (%d, %d, %d)\n", x, y, z); // prints (8, 8, 0)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.