分配運算子

將右側運算元的值分配給左側運算元指定的儲存位置,並返回該值。

int x = 5;      /* Variable x holds the value 5. Returns 5. */ 
char y = 'c';   /* Variable y holds the value 99. Returns 99 
                 * (as the character 'c' is represented in the ASCII table with 99).
                 */
float z = 1.5;  /* variable z holds the value 1.5. Returns 1.5. */
char const* s = "foo"; /* Variable s holds the address of the first character of the string 'foo'. */

一些算術運算具有複合賦值運算子。

a += b  /* equal to: a = a + b */
a -= b  /* equal to: a = a - b */
a *= b  /* equal to: a = a * b */
a /= b  /* equal to: a = a / b */
a %= b  /* equal to: a = a % b */
a &= b  /* equal to: a = a & b */
a |= b  /* equal to: a = a | b */
a ^= b  /* equal to: a = a ^ b */
a <<= b /* equal to: a = a << b */
a >>= b /* equal to: a = a >> b */

這些複合賦值的一個重要特徵是左側的表示式(a)僅評估一次。例如,如果 p 是一個指標

*p += 27;

僅引用一次 p,而以下兩次。

*p = *p + 27;

還應注意,諸如 a = b 之類的賦值的結果是所謂的右值。因此,賦值實際上具有一個值,然後可以將該值賦給另一個變數。這允許分配連結在單個語句中設定多個變數。

這個右值可以用在 if 語句(或迴圈或 switch 語句)的控制表示式中,這些語句保護一些程式碼對另一個表示式或函式呼叫的結果。例如:

char *buffer;
if ((buffer = malloc(1024)) != NULL)
{
    /* do something with buffer */
    free(buffer);
}
else
{
    /* report allocation failure */
}

因此,必須注意避免可能導致神祕錯誤的常見錯字。

int a = 2;
/* ... */
if (a = 1)
    /* Delete all files on my hard drive */

這將帶來災難性的結果,因為 a = 1 將始終評估為 1,因此 if 語句的控制表示式將始終為真(請閱讀更多有關此常見陷阱的資訊 )。作者幾乎肯定打算使用等於運算子(==),如下所示:

int a = 2;
/* ... */
if (a == 1)
    /* Delete all files on my hard drive */

運算子相關性

int a, b = 1, c = 2;
a = b = c;

這將 c 分配給 bb 將返回 b,而 b 將分配給 a。發生這種情況是因為所有賦值運算子都具有正確的關聯性,這意味著首先計算表示式中最右邊的操作,然後從右向左進行。