Присвоение переменной внутри C ++ if - PullRequest
3 голосов
/ 16 марта 2020

В c ++ следующее допустимо, и я могу запустить его без проблем

int main(){
    if (int i=5)
        std::cout << i << std::endl;
    return 0;
}

Однако, хотя следующее также должно быть допустимым, оно выдает мне ошибку

if ((int i=5) == 5)
    std::cout << i << std::endl;

ОШИБКА:

test.cpp: In function ‘int main()’:
test.cpp:4:10: error: expected primary-expression before ‘int’
     if ((int i=5) == 5)
          ^
test.cpp:4:10: error: expected ‘)’ before ‘int’
test.cpp:5:36: error: expected ‘)’ before ‘;’ token
         std::cout << i << std::endl;
                                    ^

Кроме того, в c ++ 17 ниже код тоже должен быть действительным , но это снова вызывает похожую ошибку

if (int i=5; i == 5)
    std::cout << i << std::endl;

ОШИБКА:

test.cpp: In function ‘int main()’:
test.cpp:4:16: error: expected ‘)’ before ‘;’ token
     if (int i=5; i == 5)
                ^
test.cpp:4:18: error: ‘i’ was not declared in this scope
     if (int i=5; i == 5)
                  ^

Я пытаюсь скомпилировать с g++ test.cpp -std=c++17. g++ --version дает мне g++ (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609. Что мне здесь не хватает?

Ответы [ 2 ]

6 голосов
/ 16 марта 2020

if ((int i=5) == 5) - синтаксическая ошибка, она не соответствует ни одному поддерживаемому синтаксису для операторов if. Синтаксис: условие инициализации (необязательно) условие , где условие может быть либо выражением, либо объявлением с инициализатором, более подробно о синтаксисе можно прочитать в разделе cppreference. .

if (int i=5; i == 5) правильно, однако вы используете старую версию g cc, выпущенную до стандартизации C ++ 17. Вам нужно обновить версию компилятора. В соответствии с C ++ Standards Support в G CC эта функция была добавлена ​​в G CC 7.

2 голосов
/ 16 марта 2020

Для начала, я считаю, что ваш компилятор прав, чтобы отклонить

if ((int i=5) == 5)

, потому что это недопустимый код C ++. Оператор объявления переменной не является выражением, поэтому вы не можете рассматривать (int i = 5) как выражение.

Для второго, я подозреваю, вам просто нужно обновить свой компилятор. На данный момент g ++ 5.6 является довольно старой версией, и я считаю, что больше версий g ++ обновлений справятся с этим кодом без проблем.

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