錯誤地寫作而不是比較時
=
運算子用於賦值。
==
運算子用於比較。
人們應該注意不要混淆兩者。有時一個人錯誤地寫道
/* assign y to x */
if (x = y) {
/* logic */
}
當真正想要的是:
/* compare if x is equal to y */
if (x == y) {
/* logic */
}
前者將 y 的值賦給 x 並檢查該值是否為非零,而不是進行比較,這相當於:
if ((x = y) != 0) {
/* logic */
}
有時候測試分配的結果是常用的,因為它避免了必須重複程式碼並且必須特別處理第一次。相比
while ((c = getopt_long(argc, argv, short_options, long_options, &option_index)) != -1) {
switch (c) {
...
}
}
與
c = getopt_long(argc, argv, short_options, long_options, &option_index);
while (c != -1) {
switch (c) {
...
}
c = getopt_long(argc, argv, short_options, long_options, &option_index);
}
現代編譯器將識別這種模式,並且當賦值在上面的括號內時不會發出警告,但可能會警告其他用法。例如:
if (x = y) /* warning */
if ((x = y)) /* no warning */
if ((x = y) != 0) /* no warning; explicit */
一些程式設計師使用將常量放在運算子左側的策略(通常稱為 Yoda 條件 )。因為常量是 rvalues,如果使用了錯誤的運算子,這種條件將導致編譯器丟擲錯誤。
if (5 = y) /* Error */
if (5 == y) /* No error */
然而,這嚴重降低了程式碼的可讀性,如果程式設計師遵循良好的 C 編碼實踐則不被認為是必要的,並且在比較兩個變數時沒有幫助,因此它不是通用的解決方案。此外,許多現代編譯器可能會在使用 Yoda 條件編寫程式碼時發出警告。