创作人QQ:851301776,邮箱:[email protected],欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点!
个人座右铭:
1.没有横空出世,只要厚积一定发。
2.你可以学历不高,你可以不上学,但你不能不学习
一、不同的编译器对应的数据类型所占字
基本数据类型所占的字节数其实跟C语言本身没有太大的关系,它取决于编译器的位数,下面这张表说明了不同编译器下基本数据类型的长度:
- 16位对比32位的编译器,可以发现变化的仅仅是指针变量的大小和int基本类型的大小。
- 32位的编译器,指针变量的大小都是4个字节,也就是32位。原因是32位的寻址空间,也就是每个存储单元的地址都是32位的。指针变量中存储的正好也就是这个32位的地址,所以指针变量的大小是4个字节。同理64位编译器。
早期的操作系统是16位系统:
- int 用2字节表示,范围是-2^15 ~ 2^15-1;
- long 用4字节表示,范围是-2^31 ~ 2^31-1。
后来发展到32位操作系统:
- int 用4字节表示,范围是-2^31 ~ 2^31-1;
- long 与 int 相同,也用4字节表示,范围是-2^31 ~ 2^31-1。
现在操作系统已发展到64位操作系:
- 32位编译系统:int占4字节,与long相同,范围是-2^31 ~ 2^31-1。
- 64位编译系统:int占4字节,long占8字节,long数据范围变为:-2^63~2^63-1
二、 占位符与数据类型的关系
可以使用%o作为占位符把数字的八进制表示方式显示在屏幕上
用%x做占位符的时候显示结果里的所有字母都是小写的
用%X做占位符的时候显示结果里的所有字母都是大写的
'\n' 换行
'\r' 回车
'\\' 代表字符\
'\'' 代表字符'
'\"' 代表字符"
二、操作符
1.单目操作符
- 逻辑非运算符(!)
- 按位取反运算符(~)
- 自增自减运算符(++ 或 --)
- 负号运算符(-)
- 类型转换运算符(类型)
- 指针运算符和取地址运算符(*和&)
- 长度运算符(sizeof)这些是单目运算符
2.双目操作符
- 加:+
- 减:-
- 乘:*
- 除:/
- 赋值:=
- 判断相等:==
3.三目操作符
逻辑表达式 ? 表达式一 : 表达式二
如果逻辑表达式结果为真就采用表达式一进行计算,否则采用表达式二进行计算。
注意:不要在三目表达式的问号后使用赋值操作符
4.逻辑操作符
与运算(&&)
或运算(||)
5.优先级
C语言的运算符柜多酷主要用于构成表达式,同一个符号在不同的表达式中,其作用并不一致。下面按计算的优先顺序,分别说明不同作用的表达式。需要特别指出,在C语言标准中,并没有结合性的说法。
相同优先级运算符,从左至右依次运算。注意后缀运算优先级高于前缀。因此++i++应解释为++(i++)。
(1)折叠基本表达式1级
基本表达式(Primary expressions),主要是用于运算符之间,婆棕您做为运算数。
标识,常量,字符串文字量,优先级提升表达式最优先执行。
优先级提升表达式是指圆括号包围的表达式,如"( expression )"
(2) 后缀表达式2级
postfix-expression [ expression ],数组下标运算。
postfix-expression ( argument-expression-list),函数调用,括号内的参数可选。
postfix-expression . identifier,成员访问,
postfix-expression -> identifier,成员访问,->号之前应为指针。
postfix-expression ++,后缀自增
postfix-expression --,后缀自减
( type-name ) { initializer-list }
( type-name ) { initializer-list , } 复合初始化,C99后新增。
(3)折叠单目/一元运算3级
++ unary-expression 前缀自增
-- unary-expression 前缀自减
unary-operator cast-expression 单目转型表达式, 包括 取地址& ,提领 * , 正号+ ,负号- 位反~ 逻辑否!。
sizeof unary-expression 求类型长度,对表达式求类型长度
sizeof ( type-name ) 求类型长度
(4)折叠强制类型表达式4级
( type-name ) cast-expression,强制表达式成为type-name指定的类型。
(5)折叠乘法表达式5级
" * " 乘法运算符;" / "除法运算符;" % " 取余运算符。
(6)折叠加法运算符6级
" + "加法运算符;" - "减法运算符。
(7)折叠移位运算符7级
<< 左移运算符;>> 右移运算符。
(8)折叠关系运算符8级
<、<=、>战朽坑、>=关系运算符。
(9)折叠相等运算符9级
" == "等于运算符;" != "不等于运算符。
(10)折叠位与运算符10级
" & "按位与运算符
(11)折叠位异或运算符11级
" ∧ "按位异或运算符(Bitwise exclusive OR operator)。
(12)折叠位或运算符12级
" | "按位或运算符(Bitwise inclusive OR operator)。
(13)折叠逻辑与运算符13级
"&&"逻辑与运算符。
(14)折叠逻辑或运算符14级
" || "逻辑或运算符。
(15)折叠三元条件运算符15级
? :条件运算符。
(16)折叠赋值运算符16级
=、 +=、 -=、 *=、 /=、 %=、 &=、 ^=、 |=、 <<=、 >>=赋值运算符。
(17)折叠逗号运算符17级
","逗号运算符。
[pre]C 语言中,逗号(,)也可以是运算符,称为逗号运算符(Comma Operator)。逗号运算符可以把两个以上(包含两个)的表达式连接成一个表达式,称为逗号表达式。其一般形式为:
子表达式1, 子表达式2, ..., 子表达式n
例如:a + b, c = b, c++
逗号运算符的优先级是所有运算符雅套立煮中级别最低的,通常配合 for 循环使用。逗号表达式最右边的子表达式的值即为逗号表达式的值。上例中,c++ 的值(c 自增之前的值)即为该表达式的值。
逗号运算符保证左边的子表达式运算结束后才进行右边的子表达式的运算。也就是说辩腊碑页,逗号运算符是一个序列点,其左边所有副作用都结束后,才对其右边的子表达式进行运算。因此,上例中,c 得到 b 的值后,才进行自增运算。
优先级:C语言中,运算符的运算优先级共分为15 级。1 级最高,15 级最漏捆试低。 在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符 优先级相同时,则按运算符的结合性所规定的结合方向处理。
结合性:C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。例如算术运算符的结合性是自左至右,即先左后右。如有表达式x-y+z 则y 应先与"-"号结合,执行x-y 运跨牛算,然后再执行+z 的运算。这种自左至右的结合 方向就称为"左结合性"。而自右至左的结合方向称为"右结合性"。最典型的右结合 性运算符是赋值运算符。如x=y=z,由于"="的右结合性,应先执行y=z 再执行x=(y=z)运算。C语言运算符中有不少为右结合性,应注意区别,以避免理解错误。
优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。
所有的优先级中,只有三个优先级是从右至左结合的,它们是单目运算符、条件运算符、赋值运算符。其它的都是从左至右结合。
具有最高优先级的其实并不算是真正的运算符,它们算是一类特殊的操作。()是与函数相关,[]与数组相关,而->及.是取结构成员。
其次是单目运算符,所有的单目运算符具有相同的优先级,因此在我认为的 真正的运算符中它们具有最高的优先级,又由于它们都是从右至左结合的,因此*p++与*(p++)等效是毫无疑问的。
优先级等级口诀
八位与,七位异,六位或,五与,四或,三疑,二赋,一真逗。
三、位操作符
1.~
~是一个单目位操作符,它可以根据一个数字计算出另外一个数字,这两个数字所有二进制数位的内容都不一样这个操作叫做按位求反。(0变成1,1变成0)
2.&
按位与(&)可以把两个数字对应二进制数位的内容做与计算只要一个数位的内容是0则与计算以后结果就是0
3 0000 0011
& 5 0000 0101
0000 0001
任何数位内容和0做按位与结果一定是0
任何数位内容和1做按位与结果保持不变
使用按位与可以获得某个数字里某些二进制数位的内容
使用按位与可以把某个数字中某些二进制数位的内容设置成0
3. |
按位或(|)可以把两个数字里对应二进制数位的内容做或计算,只要一个数位的内容是1则或计算以后结果就是1
3 0000 0011
| 5 0000 0101
0000 0111
任何数位内容和0做按位或结果保持不变
任何数位内容和1做按位或结果变成1
使用按位或可以把一个数字里某些二进制数位的内容设置成1
4.^
按位异或(^)可以把两个数字里对应数位的内容做异或计算,如果两个数位的内容一样则异或计算结果是0,否则结果是1
3 0000 0011
^ 5 0000 0101
0000 0110
任何数位内容和0做按位异或结果保持不变
任何数位内容和1做按位异或变成相反数字
使用按位异或可以把数字中某些二进制数位的内容变成相反数字
5.移位操作符
移位操作可以把一个数字的所有二进制数位,内容统一向左或向右移动n个位置
- >>表示向右移位操作
- <<表示向左移位操作
它们都是双目位操作符,移位操作符左边的数字是将要进行移位操作的数字,右边的数字是将要移动的位数
移位操作相当于把每个数位的内容放在另外一个数位里
向左移位的时候右边空出来的数位里固定填充0
有符号类型数字右移的时候左边空出来的数位里填充符号位的内容
无符号类型数字右移的时候左边空出来的数位里固定填充0
一般情况下左移n位相当于乘以2的n次方,右移n位相当于除以2的n次方
注意:位操作符不会修改存储区内容