C语言碎片①
有关未初始化变(常)量的值
全局变量 、静态变量初始值为0
局部变量,自动变量初始值随机分配(脏值)
原因:局部变量存在于堆栈中,栈中通过移动栈指针来给程序提供一个内存空间和这个局部变量名绑定。因为这段内存空间在栈上,而栈内存是反复使用的(用完不会清零,而是等待下次使用时覆盖掉)。局部变量存在于堆栈中,全局变量存在于静态区中,动态申请数据存在于(堆)中。
参考:https://blog.csdn.net/robert_wzf/article/details/52462923
常量与指针
const int a=6,b; /*常量只能在初始化时进行赋值,此时a是6,
而b是一个不确定的值并且也不可以在更改相当于只读模式。*/
int a,*const p=&a;/*此时绑定了指针与变量关系,指针不可以再指向其他
变量。指针p属于常量(只读),不可以通过*p=12;
这样的语句来进行对a赋值,但可以使用语句a=12;*/
const int *p;/*指向常量的指针,如果通过指针p去赋值会出现以下错误:
[Error] assignment of read-only location '*p'*/
int *const p;/*指向整型的常量指针,即绑定指针与变量关系,但指向的值
可以改变。*/
精度转换避免借位
通过数据类型转换避免也是运算时出现的借位问题。
比如:时间长度计算 1h30min - 40min 计算时会出现借位问题,可以转换为:90min - 40min 或者 ( 1+30.0/60 )h - ( 40.0/60 )h
赋值表达式知识点
int k,i=2,j=3;
k=i*j==6;//执行步骤如下:
赋值语句是运算,也有结果。eg:
printf("%d",k=i*j==6);/*此时会输出1,执行如下:
(i*j);
{( )==6};
k={ } */
逗号表达式
括号里每一部分都会执行(从左至右),并且把最后一部分作为整体的结果。
(i++,i>=5,i=10);先让i自增,在判断i是否大于等于五,在给i赋值10。
printf(" %d",(i++,i>=5,i=10));//输出10,因为最后一部分的结果就是10。
if else与switch—case
常见错误:if后面加;
多语句执行忘记大括号。
错误使用==和=。
switch—case与if else的区别
switch-case控制语句维护着一张跳转表,并不是用一系列的if-else来实现。当上一条case语句成立时,如果没有break,程序将会认为后面的语句都是附属语句,将会执行。下方链接有形成原理。
参考:http://blog.csdn.net/llyhours/article/details/78678947