錯誤地寫作而不是比較時

= 運算子用於賦值。

== 運算子用於比較。

人們應該注意不要混淆兩者。有時一個人錯誤地寫道

/* 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 條件編寫程式碼時發出警告。