簡體   English   中英

在 C 中的單個語句中分配和比較

[英]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()))
{
      ...
}

這段代碼中發生的事情依次是:

  1. some_func_ret_int_ptr()的返回值賦值給i
  2. 語句!i被檢查
  3. 如果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)

MM 的回答相同,但我會選擇:

if ((i = some_func_ret_int_ptr()) != NULL)

因為它使執行順序更清晰。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM