我在代码中发现了一个错误(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.这种情况适用于所有/大多数编译器(任何例外)吗?
答案 0 :(得分:7)
A()
。有些人翻转比较,将常数写到左边,以避免风险:
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()