Объявление двух переменных в условном выражении? - PullRequest
0 голосов
/ 18 июля 2010

Могу ли я объявить две переменные в условном в C ++.Компилятор выдал ошибку, но все же я думаю, что должен получить мнение:

int main()
{
    double d1 = 0;
    if((double d2 = d1) || (double d3 = 10))
        cout << "wow" << endl;
    return 0;
}

Ответы [ 6 ]

5 голосов
/ 18 июля 2010

Вы можете сделать это только для одной переменной

if(double d2 = d1)
    cout << "wow" << endl;
else 
if(double d3 = 10)
    cout << "wow" << endl;

Но я бы объявил их вне условий. Если вы боитесь объема, вы всегда можете ограничить его:

{
  double d2 = d1;
  double d3 = 10;
  if(d2 || d3)
    cout << "wow" << endl;
}

Конечно, это оценивает второй инициализатор, даже если d2 оценивается как true. Но я предполагаю, что это не важно.

3 голосов
/ 18 июля 2010
if((double d2 = d1) || (double d3 = 10))
    cout << d2 + d3 << endl;

оператор || замыкает накоротко, поэтому выражение d2 + d3 ссылается (потенциально) на неинициализированный d3.такая функция будет иметь много негативных последствий и IMO не принесет никакой пользы, поэтому, вероятно, ее там нет.

1 голос
/ 18 июля 2010

Может быть что-то еще, что также беспокоит вас здесь, но есть проблема с тем, как работает || -оператор.Я не помню точно, как это сформулировано в стандарте, но в a || b ваш компилятор должен не оценивать b, если a оценивается как true, или ваш компилятор может выбрать не делать этого.

Учитывая, что в своем выражении вы не будете уверены, что ваша переменная была объявлена ​​- в C ++ вы можете использовать только объявленные переменные, поэтому d3 будет довольнобесполезная переменная в вашем примере, если вы спросите меня (поскольку вы не будете уверены, была ли она объявлена).

0 голосов
/ 18 июля 2010

В C ++ вы можете сделать что-то вроде этого:

if (bool b = (a == b)) {
  // Do something with b here...
}

или:

if (double d2 = d1) {
  // ...
}

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

Более того, попытка объявить несколько переменных в условной части оператора if или while не поддерживается.Вам придется прибегнуть к вложенным if s или else if, чтобы получить ту же семантику.

Пример:

if (double d2 = d1) {
  cout << "wow" << endl;
} else if (double d3 = 10) {
  cout << "wow" << endl;
}

Этот способ d3 создается только в том случае, если d2оценивается как ложное.

0 голосов
/ 18 июля 2010

Вы можете спросить, где находится стандартная документация C ++.

Не думаю, что это хорошая идея, вы пытаетесь сказать компилятору:

объявите d2, поместите d1 в d2, сравните d2 с 0, если это! = 0, перейдите к приведенному ниже коду, иначе объявите d3, положите 10 в d3, сравните d2 с 0, если это!1006 * Хорошим решением было бы просто объявить d2 и d3 выше условного, только если вы работаете с ограниченной памятью (и не хотите выделять место для d2 и d3, пока не будет достигнут этот фрагмент кода).Все сводится к тому, что вы действительно собираетесь делать.

0 голосов
/ 18 июля 2010

Это невозможно в C ++, возможно, вы думали о C # или более новом языке программирования.Нет никаких недостатков для объявления d2 и d3 за пределами условного.

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