分配運算子
將右側運算元的值分配給左側運算元指定的儲存位置,並返回該值。
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
分配給 b
,b
將返回 b
,而 b
將分配給 a
。發生這種情況是因為所有賦值運算子都具有正確的關聯性,這意味著首先計算表示式中最右邊的操作,然後從右向左進行。