黑马程序员技术交流社区
标题: c语言刚看 为什么我打出来和视频上老师的不一样 [打印本页]
作者: 649685603 时间: 2015-11-9 21:12
标题: c语言刚看 为什么我打出来和视频上老师的不一样
#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;
}
作者: 649685603 时间: 2015-11-9 21:13
按照视频说法 最后一个a该打印出11的
作者: daitoudainaoali 时间: 2015-11-9 23:07
//这是按你的代码走第一次打印时候结果:
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是一个随机数
作者: flairamyz 时间: 2015-11-9 23:28
最后一个a打出来的是随机值,因为你在main里面定义的a并没有赋初值。{}里又定义了个a = 10,后改为11,但是}结束后这个局部的a就释放了。而你主函数的a没有赋初值,在main加了命令行参数的情况下,a的值应该是0.如果没加argc和argv,应该是个随机值。
作者: 649685603 时间: 2015-11-10 17:38
嗯嗯 谢谢 刚开始学
作者: 649685603 时间: 2015-11-10 17:39
谢谢这么上心 从新又弄了 谢谢 我刚开始学 所以你说的我有些看不懂。。但谢谢你这么用心解答
作者: tgwxfs 时间: 2015-11-10 21:31
全局a没有初始化变量,里面存的是内存中遗留的半随机数。{}内的元素的存在区,只在{ 和 }之间。执行到最后一句的时候,{}中的局部a已经消失了…
作者: poxiao 时间: 2015-11-10 21:36
这应该是作用域的问题,你在{}里面定义的变量会在出大括号时销毁,所以最后打印a值时会是一个未定义的值
作者: 865393462 时间: 2015-11-10 21:53
多看多写!理解就好
作者: wuxiaoling 时间: 2015-11-10 22:20
第一个printf打印结果是随机的,因为你的变量a没有经过初始化,第二个printf是在代码块{}里面的int a的作用域只在{}内,一旦{}运行结束,{}中定义的变量都会不存在.最后一个a的值仍是第一个值
作者: xiaolang110 时间: 2015-11-10 22:28
多写写,多练练吧!一定可以的。为自己鼓鼓劲吧。
作者: hei军 时间: 2015-11-11 19:35
哪儿不一样了
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |