if语句中带有等号“=”而不是“==”的语句

时间:2012-07-06 09:24:45

标签: c

我在代码中发现了一个错误(if语句应该有“==”instad“=”)并且我几乎没有问题。

示例代码:

int i = 5;
if (i = MyFunction())  // MyFunction() returns an int; this is where bug was made
{
  // call A()
}
else
{
  // call B()
}

从我收集的内容中,它应该总是调用A() 1.我的假设是否正确()?
2.这种情况适用于所有/大多数编译器(任何例外)吗?

6 个答案:

答案 0 :(得分:7)

  1. 不,只有在分配被认为是真的时才会调用A()
  2. 是的,这是标准的。编写代码不是一个很好的方法,因为混淆的风险很大。
  3. 有些人翻转比较,将常数写到左边,以避免风险:

    if( 12 == x )
    

    但当然这对你的情况不起作用,因为它确实是一项任务。大多数编译器会在检测到此代码时向您发出警告,因为它通常是导致错误的原因。

答案 1 :(得分:5)

如果MyFunction()返回零(0),它将调用B();否则会调用A()。赋值表达式的值是分配给左侧的值;在if语句中,0被视为false,所有其他值被视为true。

这是完全合法的代码,尽管许多编译器会发出警告。它有效的原因是在C和类似语言中,赋值是一个表达式(而不是语句)。

如果您打算分配给i并测试返回值,则应编写if ((i = MyFunction()));额外的括号向编译器(以及读者)发出指示信号。

如果你打算测试i的值,你应该写if (MyFunction() == i);通过将函数调用放在左侧,您可以确保如果错过了双等号,代码将无法编译(MyFunction() = i通常不是有效的表达式。)

答案 2 :(得分:4)

此声明是作业:

i = MyFunction()

if语句实际上是检查i的值。如果MyFunction()返回0,则i被赋值为0,它等同于:

if(0)

此计算结果为false,在这种情况下不会调用A()

答案 3 :(得分:3)

如果函数返回非零,它将采用真分支(即调用A)。 Zero被视为false,因此如果MyFunction()返回零,则会调用B

实际上,对大多数/所有编译器来说这是正确的。我认为0 =假只是一个惯例;如果它现在在C99或更高版本中正式化,我不会感到惊讶,但我没有一个方便的副本来引导你到正确的部分。

答案 4 :(得分:3)

您的假设不正确。

if - 条件中的表达式与任何其他表达式一样被评估,在您的情况下,(i = MyFunction())的结果是MyFunction()的返回值。

答案 5 :(得分:2)

您的代码将评估

  (i = MyFunction())

如果MyFunction()返回非零值,表达式将被评估为true并调用A()。否则B()