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

ded*_*bme 12 c

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

UINT A, B = 1;
if((A = B) == 1){
   return(TRUE);
} else {
   return(FALSE);
}
Run Code Online (Sandbox Code Playgroud)

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

Fer*_*yer 12

首先,它分配的值B,以A(A = B),则它检查是否此分配,这是的结果A和计算结果为1,等于1.

因此从技术上讲,你是正确的:在它的方式检查A1.

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

UINT A, B = 1;
A = B;
if(A == 1){
   return(TRUE);
} else {
   return(FALSE);
}
Run Code Online (Sandbox Code Playgroud)

  • 原来是多么暧昧?你很清楚,对我来说很清楚. (6认同)
  • 仅仅因为你可以按照问题的方式编写代码,并不意味着你应该这样做.你应该总是喜欢这个答案所写的代码,因为它没有歧义. (4认同)

Ker*_* SB 6

相反,您的代码总是分配BA它,而且它还会检查B(也因此A)的值是否等于1.

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

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