c语言,Linux,入门

LinuxC入门自学(数据类型、运算符、表达式)的10个问题

1.#define PI 3.14

  1. int a=PI;printf(%d\n,a);——a=3

  2. Printf(%d\n,PI);——PI=1374389535

1&2 仅仅差一条语句,为什么结果差的这么多?

答:define的作用:只做替换不做变换,即PI=3.14,int a=3.14,a=3;然而printf("%d\n",3.14)浮点型的数据在内存中存储的方式并不以3.14的形式储存,而是固定的算法方式储存。


2. 局部变量和全局变量的区别是什么?

答:局部变量(也称:内部变量)就是在函数体内定义的变量,他的作用域只在当前的函数体内,超出作用于后就会失效,局部变量仅仅存放在栈区内,一次性的。全局变量(也称:外部变量)函数体外定义,他的作用周期是整个程序运行结束。


3.int 值的范围?

答:int类型(有符号)一般系统会默认分配2个字节,每个字节8位,除了最高位的符号位0000 0000 0000 0000.正数:最大值除最高位0以外其他全为1,即0111 1111 1111 1111=1*10^14+1*10^13+...+1*10^1+1*10^0=2^15-1.负数:在内存中存储方式是以补码的形式存储,按位取反,值为-2^15。所以它值得范围在-2^15 ~ 2^15-1。


4.定义&声明的区别于联系

答:首先从他们的概念来看:定义就是建立一个对象同时给他分配空间;声明:建立或者引用一个变量,不为其分配空间,只是告诉编译器变量的类型和名称。某种程度上来说 声明包含定义定义就是声明的一种特殊形式。但是定义只能定义一次,声明可以多次。


5. 寄存器处理速度那么快,为什么不把所有的数据存储到寄存器或者把所有的变量都设置成register+变量名呢?

答:寄存器变量的运行速度是非常快的,一般常用于数据多且反复要计算的大循环语句中,可以节省相当多的时间。但是寄存器,缓存等属于静态存储器,它造价高,且内存小;虽然动态的存储器运行慢,但是他内存大,可存放大量的数据。所以两者相结合使用可使效率达到最大。


6.#define typedef区别:

答:#define 替换常量的值,它只做替换不做变换;typedef 给变量或结构体重命名。

#define f(x) x*x

int main()

{int a=3+1,c;c=f(a);printf(%d\n,c);}———c=3+1*3+1=7(因为宏定义define前有#所以在预编译时就被展开,计算机跟人一样很懒,所以能少算一步就少算一步,所以不会去主动给x*x加括号,只是无脑的把x*x移下来。)

 

typedef f(x) x*x

int main()

{int a=3+1,c;c=f(a);printf(%d\n,c);}———c=(3+1)*(3+1)=16(然而宏函数typedef不一样,它则在编译时将定义的法则以函数调用的形式调用,所以自动给x*x加上括号。)

 

7.typedef char *p_str

   char string[4] ="abc";

   const char *p1=string;......................1

   const p_str p2=string;.......................2

   p1++;p2++;         为什么p1++没有错,而p2++却会报错?

答:const语句仅授予变量只读权限,用户不可修改及执行,它只对后面的变量进行一个保护。typedef只是将数据类型重命名。所以1处,只是将char类型的数据做一保护并不能对p1所指向的地址做保护,所以p1++是没有问题的;然而2处,p_str p2并不是系统固定的,而是用户自定义的数据结构所以const会对后面的所有进行保护,即const (p_str p2)所以,p2只有只读权限没有改写的权限。


8.什么是枚举?

枚举跟#define类似,都是对常量赋值,但是枚举(enum)会对范围内所有的常量进行赋值。规则是:读取第一个初始化的值然后后面的值每个加一,若没有初始化则默认从0开始,每个自动加一。其形式为 :

                       enum+枚举数据类型名

                      { 所有常数,即枚举变量的取值范围; }

                      枚举变量名;


9.++操作符

int i=3;

(++i)+(++i)+(++i)  为什么不等于15?

答:刚开始我以为i=3,++i=4,再++i=5,再++i=6,所以:4+5+6=15;忽视了一点,括号优先级大于单目运算符,括号里的算3次然后6+6+6=18。



10.局部变量修饰与不加修饰的区别?

答:局部变量修饰可以使局部变量使用周期延长,即局部变量只在某作用域下的函数体内进行一次操作后失效,然而static则会使它周期延长到此次程序关闭前,使其运行一次之后可以继续用不用重新再定义,减少不必要的操作。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值