Почему я получаю «необъявленный идентификатор ошибки», если я не объявляю свою переменную в начале? - PullRequest
6 голосов
/ 23 января 2011

Когда у меня есть следующее:

#include "stdafx.h"
#include<stdio.h>
int main()
{

int val1,val2;

printf("Enter the first value");
scanf("%d",val1);
scanf("%d",&val2);
int c;
c=val1 + val2;
printf(" the value is : %d", c);



return 0; // 0 means no error

 }

Я получаю необъявленный идентификатор ошибки c.Также синтаксическая ошибка.отсутствует ;перед типом.

Однако, если я изменяю выше, следующая ошибка исчезает.Пожалуйста, помогите

#include "stdafx.h"
#include<stdio.h>

int main()
{

int val1,val2,c;

printf("Enter the first value");
scanf("%d",&val1);
scanf("%d",&val2);

c=val1 + val2;
printf(" the value is : %d", c);



return 0; // 0 means no error

}

Я использую C в VS 2010.

Ответы [ 5 ]

6 голосов
/ 23 января 2011

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

изменить & mdash; очевидно, C99 отличается от C90 в этом отношении (C99 по существу такой же, как C ++ в этом вопросе).

3 голосов
/ 23 января 2011

Объекты могут быть объявлены только в верхней части блока операторов в ISO C90.Поэтому вы можете сделать это:

#include<stdio.h>

int main()
{
    int val1,val2;

    printf("Enter the first value");
    scanf("%d",val1);
    scanf("%d",&val2);

    // New statement block
    {
        int c;
        c=val1 + val2;
        printf(" the value is : %d", c);
    }

    return 0; // 0 means no error
 }

Хотя, возможно, это будет необычно.Вопреки распространенному мнению, запуск функции - не единственное место, где вы можете объявить автоматическую переменную.Вместо создания фиктивного блока чаще используется, например, существующие блоки операторов, представленные как часть конструкции if или for.

Полезно заключать case блоки в {...}, даже если это обычно не требуется, чтобы можно было вводить временные переменные, зависящие от регистра:

switch( x )
{
    case SOMETHING :
    {
        int case_local = 0 ;
    }
    break ;

    ...
}
0 голосов
/ 23 января 2011

Еще одно наблюдение. scanf () хочет АДРЕС пункта назначения, а не его значение.

в верхнем примере вы пропускаете & в scanf ("% d", val1); . В нижнем примере он включен scanf ("% d", & val1);

"val1" против "& val1"

Не должно ли изменить проблему с переменной 'c', но, вероятно, где-то возникла ошибка синтаксиса?

0 голосов
/ 23 января 2011

Microsoft отказалась от поддержки более новых версий языка C, поэтому вы не можете смешивать код и объявления. С MSVC вы в основном застряли с C90, хотя некоторые выбранные функции (например, long long, restrict) поддерживаются.

Я бы порекомендовал либо перейти на C ++, либо использовать другой компилятор, такой как MinGW, версия GCC .

0 голосов
/ 23 января 2011

В C90 локальные переменные должны все быть объявлены в начале блока function .

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