当我在Visual Studio中的部分代码中进行逻辑比较以使用“ ==”而不是“ =”时,我感到愚蠢和忘记。我的程序已编译并运行良好,这引起了我的兴趣。 Visual Studio似乎捕获了很多错误,例如语法,但是我现在想知道为什么它在编译时甚至在编译之前都没有捕获我的错误。我已经看到其他IDE在编译之前和编译期间捕获了这些逻辑错误。
这是编译器问题吗?还是特定于IDE的问题?
我很好奇。
答案 0 :(得分:5)
C ++标准允许状态分配,但是如果您认为这有误导性,请启用警告。这是Visual Studio警告C4706。启用它的最简单方法是将编译器警告级别设置为4。
答案 1 :(得分:3)
在C ++中,赋值和比较都是与其他表达式一样的表达式。没有特定的“逻辑条件表达式”或“赋值表达式”。都是表情。
这就是为什么您可以在条件中使用任何类型的表达式的原因,而不仅仅是“布尔”或“条件”表达式。以下是一些在以下条件下有效的表达式示例:1
,0
,someFunctionReturningADoubleValue()
,someFunctionReturningAnObjectWithIntegerConversionOperator()
,"foo bar"
, 'h'
。
在C ++中,所有导致非零值的表达式都被认为是“ true”,只有值“零”(整数0
,浮点数0.0
(完全是!),{{1 }})为“假”。
赋值表达式的结果是被赋值。因此false
的结果为a = 0
(如果0
例如是a
)为false,而int
的结果为s = "hello world"
(如果{ {1}}是"hello world"
)。
这就是为什么您可能会看到一些代码的比较操作数相反的原因,例如s
,而不是char const*
。这将有助于捕获您现在遇到的此类逻辑错误,因为0 == a
不正确,并且会导致编译器错误,而a == 0
可能不会。