错误地写作而不是比较时

= 运算符用于赋值。

== 运算符用于比较。

人们应该注意不要混淆两者。有时一个人错误地写道

/* 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 条件编写代码时发出警告。