#c #if-statement #while-loop
#c #if-оператор #цикл while
Вопрос:
Я заметил, что иногда разработчики делают это в своем проекте;
while(int x = 0) {//run code}
int y = 0;
if (y = someFunction())
{//run code}
Я хочу спросить;
- почему c позволяет выполнять это в циклах, таких как while ,(возможно, также для?) и if-else, каково использование?
- когда кто-то должен сделать это в своем проекте?
- и когда подобные условия дают результат 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 :)