zhangchioulin
V2EX  ›  问与答

问一个 C 语言的问题,还没睡的同学来看看那。谢谢了

  •  
  •   zhangchioulin · Jun 17, 2015 · 4818 views
    This topic created in 4163 days ago, the information mentioned may be changed or developed.

    我遇到了一段代码百思不得其解,请看代码是C语言的
    #include <stdio.h>
    int a, b = 10;

    void test()
    {
        a++;
    
        printf("a=%d ", a);
    
    
        int a = 0;
        a++;
        printf("a=%d\n", a);
    }
    
    int main()
    {
        test();
        test();
        test();
        return 0;
    }
    

    这是C语言的代码,我想问为什么程序一开始a就直接成1了?不应该是10吗?
    会不会是某处 a = 0了?
    好奇怪啊

    38 replies  •  2015-06-18 04:39:59 +08:00
    ss098
    ss098
    Jun 17, 2015 via iPad❤️1
    1
    int a, b=10; 等价于
    int a;
    int b=10;
    moroumo
    moroumo
    Jun 17, 2015
    2
    a在一开始不应该是内存随机数吗?
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    3
    @ss098我的天,原来如此
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    4
    运行结果是:
    a=1 a=1
    a=2 a=1
    a=3 a=1
    Madimo
    Madimo
    Jun 17, 2015 via iPhone❤️1
    5
    呃....其实最上面那个 int a, b = 10 只是把 b 初始化为10了,a的值其实是未定义的,运气好会是0。
    如果按你说的应该是 int a = 10, b = 10; 这样
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    6
    @Madimo 谢谢!
    ss098
    ss098
    Jun 17, 2015 via iPad
    7
    我好像没有看对问题,重新回答一遍。

    第一条 a++ 是对全局的 a 赋值的,而 test() 中定义的是局部的。
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    8
    @moroumo 楼上解答了
    ss098
    ss098
    Jun 17, 2015 via iPad
    9
    哦不 ... 刷新又出了这么多回答,我好像想多了。
    razrlele
    razrlele
    Jun 17, 2015
    10
    @moroumo 现在int默认初始值为0了吧~
    weyou
    weyou
    Jun 17, 2015❤️1
    11
    a是一个全局变量, 放在静态(全局)数据区, 初始化时默认是0, 这个不是随机的。
    sandideas
    sandideas
    Jun 17, 2015 via iPhone
    12
    你们难道不知道c语言的全局变量会自动初始化为0么。???
    moroumo
    moroumo
    Jun 17, 2015
    13
    @razrlele int默认初始值是否为0看编译器了,所以C的编码规范是必须要初始化变量,不能依赖编译器和平台。
    crab
    crab
    Jun 17, 2015
    14
    @razrlele 函数内没初始的话是随机的。
    Andiry
    Andiry
    Jun 17, 2015 via Android
    15
    @moroumo 全局变量初始化与编译器无关
    Athrob
    Athrob
    Jun 17, 2015
    16
    不明白为什么要写这种代码, 局部变量跟全局变量重名真的好吗, 看代码的人能理解为什么要这么写吗?
    seki
    seki
    Jun 17, 2015❤️1
    17
    这个问题给人一种熟悉的感觉,那感觉可以用三个字形容,谭浩强
    aheadlead
    aheadlead
    Jun 17, 2015 via iPhone
    18
    @moroumo 应当说这是个不确定的值。
    loveuqian
    loveuqian
    Jun 17, 2015 via iPhone
    19
    逗号表达式
    怎么还没学oc啊
    loveuqian
    loveuqian
    Jun 17, 2015 via iPhone
    20
    int a = 10;
    int b = a, 20;
    zts1993
    zts1993
    Jun 17, 2015
    21
    @seki 别这样。
    xvimer
    xvimer
    Jun 17, 2015❤️1
    22
    有时候,局部变量和全局变量处理不好的话,编译也是可以通过的,然而,在链接的时候,链接器可以不动声色地影响程序的正确性。虽然题主的问题目前似乎和链接器关系不大,不过还是建议看看链接器方面的东西,对全局变量、局部变量什么的使用是很有好处的。
    lifanxi
    lifanxi
    Jun 17, 2015
    23
    @moroumo

    每个C程序员都需要一本ISO 9899,随时查阅。“全局变量”是会被保证自动初始化的,这是标准规定的,与编译器无关。

    5.1.2 All objects with static storage duration shall be initialized (set to their
    initial values) before program startup.
    6.2.4 An object whose identifier is declared with external or internal linkage, or with the
    storage-class specifier static has static storage duration.
    6.7.8
    If an object that has static storage duration is not initialized explicitly,
    then:
    — if it has arithmetic type, it is initialized to (positive or unsigned) zero;

    不过@xvimer提醒得也很有道理,参考: http://coolshell.cn/articles/10115.html
    ChanneW
    ChanneW
    Jun 17, 2015
    24
    应该编译都通不过吧
    joodo
    joodo
    Jun 17, 2015
    25
    @seki 笑尿
    46fo
    46fo
    Jun 17, 2015
    26
    11楼正解
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    27
    @moroumo 默认情况下,全局变量初始值就是0
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    28
    @weyou 懂了,又修补了我的基础,谢谢!
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    29
    @xvimer 感谢回答,今天就会看!
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    30
    @weyou 正解
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    31
    @loveuqian 吐槽我。。。我想把基础学得牢靠点,我们这里的人都是专业术语。。。不学牢靠点都不知道怎么说话了
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    32
    @ChanneW 通过了系统是 优胜美地 C的编译器是Xcode带的
    mocodo
    mocodo
    Jun 17, 2015
    33
    @zhangchioulin 有些编译器会编译不过。不过变量不初始化就使用,一般编译器都会warning的吧。
    loveuqian
    loveuqian
    Jun 17, 2015 via iPhone
    34
    @zhangchioulin
    我这10天就把c讲完了,已经开始oc啦,10天就ui啦
    loveuqian
    loveuqian
    Jun 17, 2015 via iPhone
    35
    @zhangchioulin
    我这10天就把c讲完了,已经开始oc啦,10天后就ui啦
    zhangchioulin
    zhangchioulin
    OP
    Jun 17, 2015
    36
    @loveuqian 是我看的太慢了,一起加油!
    louk78
    louk78
    Jun 17, 2015
    37
    a都没初始化
    fulvaz
    fulvaz
    Jun 18, 2015
    38
    ..............这么写代码会被打死
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3244 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 90ms · UTC 10:15 · PVG 18:15 · LAX 02:15 · JFK 05:15
    ♥ Do have faith in what you're doing.