在C语言中,比较运算符(==, !=, <, >, <=, >=)和赋值运算符(=)在语义和优先级上有所不同。历史上,这些操作之间的错误导致了软件中的缺陷:例如,将=和==混合使用通常会导致难以发现的错误。
问题:主要的困难在于赋值运算符(=)的优先级低于比较运算符。此外,赋值返回一个值(rvalue),这使得可能会写出类似while(x = y)的表达式,可能会导致意外或不明显的后果。
解决方案:必须清楚地区分==和=,理解它们在表达式链中的优先级,使用括号和linter来跟踪类似的错误。在复杂表达式中,始终留下括号以便于理解。
示例代码:
int a = 5, b = 3; if (a = b) { // 错误:赋值,不是比较 printf("a == b "); }
正确:
int a = 5, b = 3; if (a == b) { printf("a == b "); }
关键特点:
C语言中'=='和'='有什么区别,如果在条件中混淆了它们,会发生什么?
==是比较运算符,=是赋值运算符。如果使用=而不是==,则变量将获得赋值,而条件将检查该值作为布尔值。这是常见错误的原因。
可以写赋值链吗,比如a = b = c = 0?这时发生了什么?
是的,在C语言中,赋值运算符是从右到左工作的。首先c被赋值为0,然后这个值赋给b,再赋给a。所有变量将获得0。
示例代码:
int a, b, c; a = b = c = 0;
为什么表达式'if (a = 0)'与'if (a == 0)'不是同一回事?
在表达式if (a = 0)中,将0赋给a。条件总是为假(因为赋值结果为0),而不是“等于检查”。应该写成if (a == 0)。
程序员编写循环while (x = data[i]),期待条件在x为零时生效。实际上,循环只在data[i]的值为0时停止,而不是在x与data[i]匹配时停下。
优点:
缺点:
严格区分表达式,显式的比较和赋值。使用linter检查代码。
优点:
缺点: