user-0 提问: C编译报错而C++通过且能执行，求解

回复:
user: user-0
content: 什么是第一个非初始化语句，上面的代码哪里的变量定义在非初始化语句之后了，举个例子讲解一下

user: user-0
content: 可以讲得在具体一点吗，我是新手，你可以从上面代码中举个例子跟我讲解下，麻烦了

user: user-1
content: 表达式语句,包括函数调用 return  if else  switch goto 甚至 标号定义语句 （一个名字加一个冒号） C中 这些语句，一旦出现，就不可以再 声明，定义，类型，变量。函数了 想声明，只有 用 ｛｝括起来，使得声明局限在在语句组内部  PS:表达式语句，就是一个表达式，后接分号 例如 a=b+c; //赋值表达式语句 a;//单变量表达式语句 a+b;//加法表达式语句 a?b:c;//?表达式语句 printf("%d",a); //函数调用表达式语句。

user: user-1
content: C++ 鼓励 变量用到再定义 C 函数内部所有声明定义  必须在 语句块的开头 一旦有一个 非声明定义语句出现。 就不可以再定义变量，类型，声明函数  外部声明定义的位置，可以随意点 因为 函数外部对C来说，只有 类型，函数，变量的声明定义 以及预编译语句。  预编译语句，严格来说， 只是编译控制语句，不是C语言的一部分，而是编译指令，  C99  好像也可以像C++一样随处定义了，不过编译器支持的很差，可以忽略

user: user-2
content: 引用 3 楼 u011441923 的回复:什么是第一个非初始化语句，上面的代码哪里的变量定义在非初始化语句之后了，举个例子讲解一下  就是你要把变量声明放在执行语句前，比如在函数最前面先声明了所有要用到的变量

user: user-0
content: 引用 12 楼 whhvc 的回复://SqList *namelist=(SqList *)malloc(sizeof(SqList));     SqList namelist;         char strInstruct[10];     int pos;     ElemType e; 	 InitList(&namelist); 这样编译通过 你试试试过了，编译通过了，我是新手，困惑半天。。。多谢！

user: user-0
content: 引用 9 楼 lunat 的回复:上面讲的已经相当明确了。  int main()   {       //SqList *namelist=(SqList *)malloc(sizeof(SqList));     SqList namelist;     char strInstruct[10];     int pos;     ElemType e;      InitList(&namelist);      while(~scanf("%s",strInstruct))     {           if(!strcmp(strInstruct,"insert"))         {             scanf("%d%s",&pos,e.name);             ListInsert(&namelist,pos,e);         }           else if(!strcmp(strInstruct,"show"))         {             ListShow(&namelist);           }           else if(!strcmp(strInstruct,"delete"))           {               scanf("%s",e.name);               pos=LocateElem(&namelist,e,cmp);               ListDelete(&namelist,pos,&e);           }           else if(!strcmp(strInstruct,"search"))           {               scanf("%s",e.name);               printf("%d\n",LocateElem(&namelist,e,cmp));           }       }       return 0; }//C编译时报错，把文件改成cpp后缀，编译通过并且可以运行，以下是错误代码  真的可以了，多谢了，我是新手，上面说的那些对我来说有些抽象，看你这个就懂了，多谢了

user: user-0
content: 引用 10 楼 lunat 的回复:另外，你的~scanf是哪个老师交给你的？？。。。我知道也可以用scanf("%s", strInstruct) != EOF，我看网上其他人这样用，我就尝试一下。。。

user: user-3
content: //SqList *namelist=(SqList *)malloc(sizeof(SqList));     SqList namelist;         char strInstruct[10];     int pos;     ElemType e; 	 InitList(&namelist); 这样编译通过 你试试

user: user-3
content: SqList namelist;     InitList(&namelist);     char strInstruct[10]; 你在执行函数后再定义变量 就不行啊

user: user-4
content: 另外，你的~scanf是哪个老师交给你的？？

user: user-4
content: 上面讲的已经相当明确了。  int main()   {       //SqList *namelist=(SqList *)malloc(sizeof(SqList));     SqList namelist;     char strInstruct[10];     int pos;     ElemType e;      InitList(&namelist);      while(~scanf("%s",strInstruct))     {           if(!strcmp(strInstruct,"insert"))         {             scanf("%d%s",&pos,e.name);             ListInsert(&namelist,pos,e);         }           else if(!strcmp(strInstruct,"show"))         {             ListShow(&namelist);           }           else if(!strcmp(strInstruct,"delete"))           {               scanf("%s",e.name);               pos=LocateElem(&namelist,e,cmp);               ListDelete(&namelist,pos,&e);           }           else if(!strcmp(strInstruct,"search"))           {               scanf("%s",e.name);               printf("%d\n",LocateElem(&namelist,e,cmp));           }       }       return 0; }//C编译时报错，把文件改成cpp后缀，编译通过并且可以运行，以下是错误代码

user: user-5
content: 别用vc6了，换visual studio 2015 community版。

user: user-0
content: 引用 5 楼 lm_whales 的回复:C++ 鼓励 变量用到再定义 C 函数内部所有声明定义  必须在 语句块的开头 一旦有一个 非声明定义语句出现。 就不可以再定义变量，类型，声明函数  外部声明定义的位置，可以随意点 因为 函数外部对C来说，只有 类型，函数，变量的声明定义 以及预编译语句。  预编译语句，严格来说， 只是编译控制语句，不是C语言的一部分，而是编译指令，  C99  好像也可以像C++一样随处定义了，不过编译器支持的很差，可以忽略多谢你回答这么多，不过我感觉还是有点抽象，因为我前几个题目都是类似这样做的，C编译没问题的，为什么这个题目不行呢，具体我上面代码怎么改才能让它在C编译通过呢，我用的是VC++6.0，那我以后编程都用.cpp的文件了吗，还是可以继续用.c的文件呢

user: user-6
content: C语言的变量定义必须在第一个非初始化语句之前。