A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

#include <stdio.h>

int main(int argc, const char * argv[]) {
    int a;
    printf("a = %d\n",a);
    {
        int a = 10;
        printf("a = %d\n",a);
        a = 11;
        printf("a=%d\n",a);
        
    }
    printf("a=%d\n",a);
    return 0;
}

11 个回复

倒序浏览
按照视频说法 最后一个a该打印出11的
回复 使用道具 举报
//这是按你的代码走第一次打印时候结果:

a = 1727619126
a = 10
a=11
a=1727619126
//这是按你的代码走第二次打印的结果

a = 1713840182
a = 10
a=11
a=1713840182
/*
这是最外层变量a定义为stastic时候打印的结果
自动变量(auto变量)和静态变量(static变量)主要有以下几点区别:
1、static变量存放在静态存储区,在程序整个运行期间都不释放;而auto变量存放在动态存储区,随着生命周期的结束而立即释放。
2、static变量只赋值一次,以后就不用赋值;而auto变量在函数每调用一次都要赋初值。
3、如果用户不对static变量赋初值,则默认为0或'\0';而auto变量为不确定值。
*/
a = 0
a = 10
a=11
a=0
//这是最外层a赋值为1时候打印结果:
a = 1
a = 10
a=11
a=1
主要是变量a定义域的问题:
第一个a,未初始化,在第一个变量a里又定义了第二个变量,并赋了初值10,程序紧接着打印a=10,接着看第三个a是在第二个a基础上重新赋值11,再次打印a时候,a的值已经被变了(注意这个a前面如果加int的话,是错误的,但是如果加个int后不出错的话,需要用大括号将int a=11连同下面的输出语句括起来,相当于在第二个a里有定义看了一个a,这种情况打印出爱还是a=11),在最里层右大括号结束时候,里层大括号里的a就释放了,不存在了,所以,最后一个打印的是最外层的a是一个随机数

回复 使用道具 举报
最后一个a打出来的是随机值,因为你在main里面定义的a并没有赋初值。{}里又定义了个a = 10,后改为11,但是}结束后这个局部的a就释放了。而你主函数的a没有赋初值,在main加了命令行参数的情况下,a的值应该是0.如果没加argc和argv,应该是个随机值。
回复 使用道具 举报
flairamyz 发表于 2015-11-9 23:28
最后一个a打出来的是随机值,因为你在main里面定义的a并没有赋初值。{}里又定义了个a = 10,后改为11,但是 ...

嗯嗯  谢谢  刚开始学
回复 使用道具 举报
daitoudainaoali 发表于 2015-11-9 23:07
//这是按你的代码走第一次打印时候结果:
a = 1727619126a = 10a=11a=1727619126//这是按你的代码走第二次 ...

谢谢这么上心   从新又弄了  谢谢 我刚开始学 所以你说的我有些看不懂。。但谢谢你这么用心解答
回复 使用道具 举报
tgwxfs 中级黑马 2015-11-10 21:31:07
7#
全局a没有初始化变量,里面存的是内存中遗留的半随机数。{}内的元素的存在区,只在{ 和 }之间。执行到最后一句的时候,{}中的局部a已经消失了…
回复 使用道具 举报
poxiao 中级黑马 2015-11-10 21:36:17
8#
这应该是作用域的问题,你在{}里面定义的变量会在出大括号时销毁,所以最后打印a值时会是一个未定义的值
回复 使用道具 举报
865393462 来自手机 中级黑马 2015-11-10 21:53:13
9#
多看多写!理解就好
回复 使用道具 举报
第一个printf打印结果是随机的,因为你的变量a没有经过初始化,第二个printf是在代码块{}里面的int a的作用域只在{}内,一旦{}运行结束,{}中定义的变量都会不存在.最后一个a的值仍是第一个值
回复 使用道具 举报
多写写,多练练吧!一定可以的。为自己鼓鼓劲吧。
回复 使用道具 举报
hei军 中级黑马 2015-11-11 19:35:24
12#
哪儿不一样了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马