一、变量赋值
赋值有两种方式
1、赋初值(初始化,是在变量开辟空间的时候i,并伴随着 赋值)eg.int i = 10
2、赋值 (空间早就开好了,然后之后再赋值进去)eg.i=10
比较:初始化效率比赋值效率更高。
注意
变量不赋值,其会随机分配一段空间,其值也是随机
二、运算符
在学习过程中,要注意运算符和表达式,学习时注意样式干什么用,优先级。
常见运算符以及作用如下
部分知识点解释如下
- 结合方向是指同等级的情况下,结合方向自左向右
- 操作数,操作符(1(左操作数/一运算数)+2(右操作数/2运算数))
- 需要两个操作数的运算符称为双目运算,其他的依次类推
2.1 除法
i/j除法运算的符号,注意在此时分母不能为0,在Linux里面该过程,在编译不报错,但是在运行的时候报错。
2.2 求余
和除法一样,注意分母不能为0,求余左右两个操作数要求必须是整型或者相兼容的数据类型(char型)
注意
i % j 求余运算的符号,与左操作数有关,与右操作数无关
求余运算符的特性
结论:求余表达式的结果最大到达右侧表达式的数值,但是达不到该数字。
2.3 ++
1、++ 自增对于浮点型也适用,字符型也适用,分为两种
- i++(单目) 先用再加
- ++ i(单目)先加再用
2、底层原理:++i ,i 同一个空间,在单纯希望自增+1,前++效率高于后++
3、图示分析++i,与i++的本质区别,以及为什么值的改变过程
所以,i++ 表达式是临时变量,但i加了。
注意点以及常见问题
- i++ +i++ 注意在同一段里面不要反复++,这样的做法不友好。
- --i,i--与++原理一致,我们可以相同对待
- lvalue(left value)左值 locatable 能够在内存中定位的,都是左值。能够取到地址,&i 则说明为左值
- rvalue(right value)右值 readable 不能够在内存中定位的,都是右值。
- 左值和右值基准点,在c/c++里面的基准点是=(赋值左边只能放变量名,右值常量只能放在右边,函数表达式)
- 左值可以改变,右值不能发生改变,
- 临时变量是一个右值,不能拿来被赋值,以及不能拿来进行自增改变。
- ++i++ 写法不规范引起的错误;i++ 是一个临时变量,值不能改变,和常量的一样,不能发生改变,所以不能拿来自增。++i所以此时此刻的i 为常量。不能再自加。
面试题
- const int i = 2;
- const 常量(constant) 定义后 i不能发生改变了。
- 在Linux里面 const int i = 2;i是可以取地址,因为本质上i是一个变量。
2.4 各类数值型数据间的混合运算
隐式转换
(出现级别差/或者存在必转类型)
显示转换
(类型转换符)强制类型转换:进行临时转换类型,造出级别差,导致整个表达式能够达到预期的目标。eg:(double)i / j
这种强制只是临时的,会开辟一个临时变量区,最后会消除掉,因此不能这样干 (int) i = 100;这样是错误的。并不会改变原来的结果。
printf()函数:默认在小数点后面输出6位有效数字。超过的数字会进行四舍五入。
常见错误以及注意点
unsigned 类型都是恒大于0,我们经常忽视这个问题,造成结果与预期有差距。
2.5 不同数据类型之间的混合赋值
- double = int (因为double本来就既包含整数又有小数) 不会发生任何错误
- int = double 小数部分截断 这种只保留整数
- short = int s装不下,高位截断(低位保留,高位丢弃)
- int = short (符号位扩展) 可以装下,正整数多出来的空位补为0高位,负的,多出来补FF高位,总的来说补的就是该数的符号位。
- unsigend int = int 只要内存空间一样大,直接拿来拷贝
- % d 有符号 输出 % u 无符号 输出 这两者是来显示我们表示的形式。
- int = unsigende short 扩展的高位还是取决与符号位,因为是无符号类型,则其没有符号位,是数值,则将其补0
- 逗号表达式(顺序求职运算符)从左往右运算按顺序求解ret =(1+2,3 * 8 ,7 -4 );最后结果是最右边的表达式
注意
printf(0),这个括号是函数运算符,是调用函数运算符。
不带上()的话,会将3赋给ret 因为赋值运算符优先级高于,如下图所示。
三、学习心得
在学习该过程的时候我遇到的问题如下:
- 对于C语言每一个表达式都有自己的类型,所以在写表达式的时候注意数据类型
- 编译器只做类型检查
- 所以字母为0,相除不报错
- 编写代码的错误
- 编译时,运行时没有错误
- 编译时有警告,运行正常
- 编译时error,运行失败
- 编译时没有问题,运行时候出错 (浮点型出错),cpu会根据其出错,直接终止,称为程序的奔溃