когда нужно сделать это в c ; if(x = 0) {}

#c #if-statement #while-loop

#c #if-оператор #цикл while

Вопрос:

Я заметил, что иногда разработчики делают это в своем проекте;

 while(int x = 0) {//run code}
  
 int y = 0;
if (y = someFunction())
{//run code}
  

Я хочу спросить;

  1. почему c позволяет выполнять это в циклах, таких как while ,(возможно, также для?) и if-else, каково использование?
  2. когда кто-то должен сделать это в своем проекте?
  3. и когда подобные условия дают результат true?

Комментарии:

1. Я тоже рад снова открыть, если вы не считаете, что это дубликат. Я, конечно, не прочь увидеть объяснение while(int x = 0) { .

2. @Bathsheba Вы всегда можете пинговать пользователя, который вводит в заблуждение сообщение, если вы не согласны с закрытием. Они несут ответственность за голосование о закрытии и в большинстве случаев будут рады провести повторную оценку.

3. @cigien: Пинг!!!!!

4. @Batsheba тогда ты простой гость. Показать вас while(0 != x) на ужин даже дешевле, чем мерло

5. Обратите внимание, что 2 фрагмента не эквивалентны. Первый вычисляется false как , но второй зависит от someFunction . Не могли бы вы также добавить источник, где вы это видели? Окружающий контекст может помочь понять вариант использования.

Ответ №1:

каково использование?

Объявление внутри if / for / while позволяет уменьшить область видимости переменной.

итак, вместо

 int y = somevalue();
if (y) {// y != 0
// ...
}
// y still usable :/
  

или

 { // extra block :/
    int y = somevalue();
    if (y) {// y != 0
        // ...
    }
}
// y no longer usable :)
  

вы могли бы напрямую сделать:

 if (int y = somevalue()) // y != 0
    // ...
}
// y no longer usable :)
  

с синтаксисом, который действительно может удивить.

Для более спорных:

 int y;
// ...
if (y = somevalue()) // y != 0
    // ...
}
// y still usable :)
  

это разрешено, поскольку это присвоение является выражением, преобразуемым в bool (значение y = x is y (которому было присвоено x )).

это более противоречиво, поскольку подвержено ошибкам, поскольку неясно, ожидается ли = или == . в некоторых соглашениях используются дополнительные родительские элементы для более четкого выражения назначения

 if ((y = somevalue())) // really = intended, not ==
    // ...
}
  

когда кто-то должен сделать это в своем проекте?

Для существующих проектов попробуйте использовать существующее соглашение.

Для нового проекта вы должны выполнить обмен:

область видимости и синтаксис, не разделяемые с другим языком, что может быть удивительно

и когда подобные условия дают результат true?

когда заданное выражение преобразуется в true, то есть ненулевой интеграл, ненулевой указатель.

c 17 вводит другой синтаксис, позволяющий разделить объявление и условие для if / while . ( for уже разрешает это разделение)

 if (int y = somevalue(); y != 42) // y != 42
    // ...
}
// y no longer usable :)