错误地写作而不是比较时
=
运算符用于赋值。
==
运算符用于比较。
人们应该注意不要混淆两者。有时一个人错误地写道
/* 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 条件编写代码时发出警告。