为什么Microsoft的C / C ++编译器允许使用逗号分隔表达式的if语句?

时间:2016-01-13 12:04:11

标签: c++ if-statement gcc compiler-errors

最近,在将一个c ++项目从Windows移植到Linux时,我偶然发现了一些语法奇怪的代码。

if ( isObjectNear( objectPos, objectLength ) + .025, 0.125 ) { ...  }"

在这个if语句中,括号错位,导致语句由两个用逗号分隔的表达式组成。布尔“isObjectNear(..)”方法有默认参数,允许使用Microsoft的编译器进行调用,尽管有明显的错误。

在使用GCC在Linux上构建时,发现了一个问题:

  

错误:未使用计算的值[-Werror = unused-value]

我的案例中的代码比问题的相关性更有趣,以下代码更清楚地用于评论中的返回值来表达问题的目的:

if ( true, 0.5 ) ... // returns true since 0.5 > 0 ( 0 == false)

if ( true, 0.0 ) ... // returns false 

if ( 1.0, false ) ... // returns false

if ( true, false, false, ..., true ) ... // returns true

回到问题“为什么Microsoft的C / C ++编译器允许使用逗号分隔表达式的if语句?”

1 个答案:

答案 0 :(得分:3)

允许,因为它在语法上是正确的,并且符合标准的编译器必须接受它。

GNU编译器猜测丢弃左手表达式的结果不是故意的,并且有助于给出警告。您已告诉编译器将警告视为错误。如果您还没有这样做,那么gcc也会允许

当不使用表达式的结果时,标准不要求编译器提供诊断,并且Microsoft可能选择不这样做。即使在gcc中,即使Wunused-value也未启用Wall,这表明它被视为可能存在许多误报的选项。不过,我不认为这个案例是误报。在我看来,一个明显的程序员错误。

编辑。显然,msvc也发出警告,正如Richard Crittenden所评论的那样。