开发者

Why do I get "error undeclared identifier" unless I declare my variable at the beginning?

When I have following:

#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

 }

I get error undeclared identifier c. Also, syntax error. missing ; before type.

However, if I change above to following error disappears. Please help

#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);



r开发者_运维知识库eturn 0; // 0 means no error

}

I am running C in VS 2010.


In C, at least back in the old days, variable declarations have to come at the top of the block. C++ is different in that regard.

edit — apparently C99 is different from C90 in this respect (C99 being essentially the same as C++ on this issue).


Objects may only be declared at the top of a statement block in ISO C90. You can therefore do this:

#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
 }

Though it would perhaps be unusual to do so. Contrary to somewhat popular belief, the start of a function is not the only place you can declare an automatic variable. It is more common, rather than creating a dummy block, to use existing statement blocks introduced as part of an if or for construct for example.

It is useful to enclose case blocks in { ... }, even though not normally necessary, so that you can introduce temporary case specific variables:

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

    ...
}


Microsoft decided against supporting newer revisions of the C language, so you can't mix code and declarations. With MSVC, you're basically stuck with C90, although some selected features (eg long long, restrict) are supported.

My recommendation would be to either switch to C++ or use a different compiler like the MinGW edition of GCC.


One other observation. scanf() wants the ADDRESS of the destination, not it's value.

in the top example you are omitting the & in scanf("%d",val1); . In the bottom example it is included scanf("%d",&val1);

"val1" vs "&val1"

Shouldn't change the problem with the variable 'c', but probably causing a syntax error somewhere?


In C90, local variables must all be declared at the beginning of a function block.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜