将条件检查和变量赋值放在一个if语句中

我正在看一些遗留的C代码并感到困惑,它是这样的:

UINT A, B = 1; if((A = B) == 1){ return(TRUE); } else { return(FALSE); } 

我们都知道如果我们这样做(A = B)会有编译器警告,但是这里看起来’if’正在检查A对1,我是否正确?

首先,它将B的值分配给AA = B ),然后检查该赋值的结果,即A和求值为1 ,是否等于1

所以从技术上讲,你是对的:在检查A的方式上是1

为了使事情更容易阅读,代码相当于:

 UINT A, B = 1; A = B; if(A == 1){ return(TRUE); } else { return(FALSE); } 

相反,您的代码总是将B分配给A ,而且它还检查B的值(以及A )是否等于1

关于这一点没有什么“遗产”,如果您需要操作的结果但又想检查错误,这通常是一个非常方便的习惯用法:

 int result; if ((result = foo()) != -1) { printf("The result is: %i\n", result); } else { // panic } 

如果你想把它保持在1行:

 if ((A = B), A == 1) 

做同样的事情。

正确。 分配后的值A将与1进行比较。

此代码示例仅相当于:

 return (TRUE); 

我们试图避免if语句使代码更具可读性。

 UINT A, B = 1; bool fResult = false; fResult = (A == B); return(fResult); 

如果必须有条件对(非)平等采取行动,请参阅此示例。

 UINT A, B = 1; bool fResult = false; fResult = (A == B); if(fResult) { doThis(); } else { doThat(); } return(fResult);