Поместите проверку условия и присвоение переменной в один оператор if - PullRequest
10 голосов
/ 28 июля 2011

Я смотрю на какой-то устаревший код C и запутался, это что-то вроде:

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

Мы все знаем, что будет предупреждение компилятора, если мы сделаем if (A = B), но здесьПохоже, «если» проверяет А против 1, я прав?

Ответы [ 5 ]

11 голосов
/ 28 июля 2011

Сначала присваивается значение B A (A = B), затем проверяется, равен ли результат этого присваивания, равный A и оценивается как 1, 1.

Итак, технически вы правы: на пути проверки A против 1.

Чтобы упростить чтение, код эквивалентен:

UINT A, B = 1;
A = B;
if(A == 1){
   return(TRUE);
} else {
   return(FALSE);
}
6 голосов
/ 28 июля 2011

Скорее, ваш код всегда присваивает B A, и он также проверяет, равно ли значение B (и, следовательно, A) 1.

В этом нет ничего «устаревшего», это обычно довольно удобная идиома, если вам нужен результат операции, но вы также хотите проверять ошибки:

int result;
if ((result = foo()) != -1)
{
  printf("The result is: %i\n", result);
}
else
{
   // panic
}
2 голосов
/ 28 июля 2011

Если вы хотите сохранить его в 1 строке:

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

делает то же самое.

0 голосов
/ 01 августа 2011

Мы стараемся избегать, если операторы делают код более читабельным.

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);
0 голосов
/ 28 июля 2011

Правильно. Значение A после присвоения будет сравниваться с 1.

Этот пример кода эквивалентен просто:

return (TRUE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...