• c语言定义变量的位置(转)


    转载至 http://wenku.baidu.com/view/d3adc6d03186bceb19e8bb6a.html

    在标准C中规定变量定义必须放在所有的执行语句之前!一旦在运行语句之间再有定义的话,会报错误!
    见以下式例:
    #include <stdio.h>
    int main()
    {
        char char1='A';
        printf("大写字符=%c的ASCII码=%d\n",char1,char1);
        char char2=char1+32;
        printf("小写字符=%c的ASCII码=%d\n",char2,char2);
        return 0;
    }
    把上述代码放到命名为test.c的文件中(VC 6.0调用C编译器),编译。出现编译错误:
    d:/project/c++/test/1.c(12) : error C2143: syntax error : missing ';' before 'type'
    d:/project/c++/test/1.c(14) : error C2065: 'char2' : undeclared identifier

    这是因为在上述代码中char char2=char1+32;的定义放在了执行语句printf("大写字符=%c的ASCII码=%d/n",char1,char1);的后面导致的;
    一旦把上述同样的语句放到了test.cpp文件中(VC 6.0调用C++编译器),编译没有问题,这是因为编译器认为上述代码是C++语法格式的;
    在C++中没有严格要求变量定义一定要放在执行语句之前。如果在.c文件中执行上述代码的话,可以在编译器设置用C++编译!

    在.c文件中(C)正确的代码为:
    #include <stdio.h>
    int main()
    {
    char char1='A';
    char char2=char1+32;
    printf("大写字符=%c的ASCII码=%d/n",char1,char1);
    /*char char2=char1+32; */ /*在C中变量定义必须放在所有的执行语句之前!*/
    printf("小写字符=%c的ASCII码=%d/n",char2,char2);  
    return 0;
    }
    这就是C标准的问题
    C89规定,在任何执行语句之前,在块的开头声明所有局部变量。
    C99以及C++中则没有这个限制,即在首次使用之前,可在块的任何位置都可以声明变量
    另一方面,编译器不同也不同,gcc编译器有很多扩展的功能,可完美支持C99标准。
    关于变量的定义:
    以花括号{}给包围起来的代码段称为block,只要在block开始的地方定义变量就不会错;
    该变量的作用域和生存期(除了static限定)只在该block里,且该变量可以屏蔽block外的变量;
    譬如在block外已经有一个变量名为a = 1的int变量,在block里允许定义一个同名的变量int a = 2,但在block里试着用printf打印的话,会发现printf("%d", a)结果是2.这就叫做屏蔽外面的变量!

  • 相关阅读:
    职位晋升的潜规则
    mybatis中的多对多的查询
    mybatis的自关联查询
    Git使用步骤
    Junit测试出现异常:Exception in thread "main" java.lang.NoSuchMethodError: org.junit.platform.commons.util.
    Spring中的前置增强和后置增强
    Spring中的异常增强
    mybatis中session.getMapper()方法和resultMap
    mybatis中的多对一的查询
    mybatis中的一对多的查询
  • 原文地址:https://www.cnblogs.com/kmliang/p/2862699.html
Copyright © 2020-2023  润新知