C ++ - Странная проблема с инициализацией l oop - PullRequest
1 голос
/ 29 марта 2020

Компилятор не может обработать даже самый простой l oop

#include <iostream>
using namespace::std;

int main()
{

    for( int i = 0, char a = 'A'; i <= 26; i++, a++ )

    cout << "OK, lets try. Showing values: i = "
         << i << ", a = " << a << endl;
}

Компилятор говорит следующее:

prog.cpp: In function ‘int main()’:
prog.cpp:7:18: error: expected unqualified-id before ‘char’ 
prog.cpp:7:18: error: expected ‘;’ before ‘char’ 
prog.cpp:7:39: error: expected ‘)’ before ‘;’ token 
prog.cpp:7:41: error: name lookup of ‘i’ changed for ISO ‘for’ scoping [-fpermissive] 
prog.cpp:7:41: note: (if you use ‘-fpermissive’ G++ will accept your code) 
prog.cpp:7:46: error: ‘a’ was not declared in this scope 
prog.cpp:7:50: error: expected ‘;’ before ‘)’ token

И да, я знаю, что могу инициализировать 'i' и «а» перед l oop. Итак, давайте попробуем:

#include <iostream>
using namespace::std;

int main()
{
    int i = 0;

    for(i = 0, char a = 'A'; i <= 26; i++, a++ )

    cout << "OK, lets try. Showing values: i = "
         << i << ", a = " << a << endl;
}

Компилятор говорит:

prog.cpp: In function ‘int main()’:
prog.cpp:8:13: error: expected primary-expression before ‘char’
prog.cpp:8:13: error: expected ‘;’ before ‘char’
prog.cpp:8:41: error: ‘a’ was not declared in this scope

Когда используется опция -std = c ++ 11:

prog.cpp: In function ‘int main()’:
prog.cpp:7:17: error: expected unqualified-id before ‘char’
prog.cpp:7:17: error: expected ‘;’ before ‘char’
prog.cpp:7:38: error: expected ‘)’ before ‘;’ token
prog.cpp:7:40: error: ‘i’ was not declared in this scope
prog.cpp:7:45: error: ‘a’ was not declared in this scope
prog.cpp:7:49: error: expected ‘;’ before ‘)’ token

Последняя:

#include <iostream>
using namespace::std;

int main()
{
    int i = 0;
    char a = 'A';

    for(i = 0, a = 'A'; i <= 26; i++, a++ )

    cout << "OK, lets try. Showing values: i = "
         << i << ", a = " << a << endl;
}

Работает нормально. Ребята, я слепой или что? Может быть, вам нужна моя версия арки и компилятора:

uname -a
Linux freelancer 3.2.0-4-686-pae #1 SMP Debian 3.2.63-2+deb7u2 i686 GNU/Linux
g++ --version 
g++ (Debian 4.7.2-5) 4.7.2

Ответы [ 2 ]

3 голосов
/ 29 марта 2020

Вы не можете объявлять элементы разных типов в одном и том же объявлении.

Это верно внутри и снаружи циклов. Вы не "слепой", это просто не правильно C ++.

Вот правильный код:

#include <iostream>
using namespace::std;

int main()
{
    int i = 0;
    char a = 'A';

    for(; i <= 26; i++, a++ )

        cout << "OK, lets try. Showing values: i = "
            << i << ", a = " << a << endl;
}

Ваша рабочая версия также действительна, потому что объявление можно заменить на выражение хотя в вашем случае это избыточно, потому что эти переменные уже содержат эти значения в начале l oop.

0 голосов
/ 29 марта 2020

26 - настолько крошечное число, что вы можете сделать

#include <iostream>

int main()
{
    for( char i = 0, a = 'A'; i <= 26; i++, a++ )
        std::cout << "OK, lets try. Showing values: i = "
            << static_cast<int>(i) << ", a = " << a << std::endl;
}

Или даже ИМХО более ясный код, более ясную цель, итерацию от «A» до «Z».

int main()
{
    for( char i = 0, a = 'A'; a <= 'Z'; i++, a++ )
        std::cout << "OK, lets try. Showing values: i = "
            << static_cast<int>(i) << ", a = " << a << std::endl;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...