Подтвердить что ты не робот

Как объявить переменную внутри оператора if()?

Возможный дубликат:
Объявление и инициализация переменной в инструкции Conditional или Control в С++

Вместо этого...

int value = get_value();
if ( value > 100 )
{
    // Do something with value.
}

... можно уменьшить объем значения только там, где это необходимо:

if ( int value = get_value() > 100 )
{
    // Obviously this doesn't work. get_value() > 100 returns true,
    // which is implicitly converted to 1 and assigned to value.
}
4b9b3361

Ответ 1

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

#include <iostream>

int get_value() {
    return 101;
}

int main() {
    {
        int value = get_value();
        if(value > 100)
            std::cout << "Hey!";
    } //value out of scope
}

Ответ 2

Можете ли вы объявить переменную и сравнить ее в инструкции if()? Нет.
Можете ли вы объявить переменную и сравнить ее таким образом, чтобы область жестко привязана к блоку if()? Да


Вы можете объявить переменную:

if (int x = 5) {
   // lol!
}

или вы можете делать что-то с одним:

int x = foo();
if (x == 5) {
   // wahey!
}

Вы не можете обойти оба!


Вы можете немного обмануть, где единственное, что вам нужно сделать, это сравнить с true, потому что само объявление оценивает значение нового объекта.

Итак, если у вас есть:

int foo()
{
   return 0;
}

Затем это:

if (int x = foo()) {
    // never reached
}

эквивалентно:

{
   int x = foo();
   if (x) {
       // never reached
   }
}

Этот окончательный синтаксис, используя отдельный блок области видимости, также является вашей золотой пулей для более сложных выражений:

{
   int x = foo();
   if (x > bar()) {
       // wahooza!
   }
}

Ответ 3

Поместите его в функцию:

void goodName(int value) {
    if(value > 100) {
        // Do something with value.
    }
}

//...
    goodName(get_value());

Ответ 4

Как использовать for вместо?

for (int value = get_value(); value > 100; value = 0) {
    //...
}

Если вы хотите перейти на С++ 11, вы можете использовать lambda:

[](int value = get_value()) {
    if (value > 100) {
        //...
        std::cout << "value:" << value;
    }
}();

Ответ 5

Или вы можете просто добавить дополнительный набор фигурных скобок для вложенной области, хотя это не совсем красиво:

{
    int value = get_value();
    if ( value > 100 )
    {
        // Do something with value.
    }   
}
//now value is out of scope

Ответ 6

Вы можете написать небольшую функцию, которая может выполнить сравнение для вас и вернуть значение, если сравнение возвращает true, иначе return 0, чтобы избежать выполнения блока if:

int greater_than(int right, int left)
{
   return left > right ? left : 0;
}

Затем используйте его как:

if ( int value = greater_than(100, get_value()))
{
      //wow!
}

Или вы можете использовать for, как сказал другой ответ. Или вручную поместите фигурные скобки, чтобы уменьшить область действия переменной.

Во всяком случае, я бы не написал такой код в производственном коде.

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

Ответ 7

В этом конкретном случае вы можете использовать его:

if (int value = (get_value() > 100 ? get_value() : 0)) {
    ...
}

Я действительно не рекомендую это делать. Он не работает для всех возможных тестов, которые вы, возможно, захотите выполнить, и дважды вызывает get_value().