C学习笔记
——类型、运算符、表达式
注: 该颜色语句仅为本人个人理解!!!
一、变量名
变量名主要由 字母和 数字组成。 第一个字符必须为字母。“_”属于字母。 区分大小写!由于库例程的名字通常以 下划线 开头,因此,用户变量命名最好不要以下划线开头。传统C语言中, 变量常用小写字母,符号常量常用大写。局部变量用短名,外部变量用长名。更具体的命名方式可以参考: http://c.biancheng.net/cpp/html/437.html
二、变量长度
char <span style="white-space:pre"> </span><span style="white-space:pre"> </span>通常<span style="white-space:pre"> </span>1 Byte int<span style="white-space:pre"> </span>通常代表特定机器中的整数的自然长度。可以为 2 Bytes /4 Bytes。 short int<span style="white-space:pre"> </span>通常<span style="white-space:pre"> </span>2 Bytes long int <span style="white-space:pre"> </span>通常<span style="white-space:pre"> </span>4 Bytes float<span style="white-space:pre"> </span>通常<span style="white-space:pre"> </span>4 Bytes double <span style="white-space:pre"> </span>通常<span style="white-space:pre"> </span>8 Bytes
不同机器可以自定类型长度,但:int 与 short int 至少 2 Bytes;long int 至少 4 Bytes。可以利用 sizeof函数来查看具体变量长度。也可以通过头文件 ”limits.h“和 ”float.h“查看。unsigned 与 signed 也可修饰 char 型,取决于具体机器。
三、常量
长整类型常量以字母 l 或 L 结尾。如:55555L / 55555l无符号型常量以字母 u 或 U 结尾。float型常量以字母 f 或 F 结尾。( 没有后缀的浮点型变量默认为double型)浮点型常量后再加以 l 或 L 结尾,则表示 long double型。另外,一般整形数为十进制型,若前缀有数字 0 ,则为八进制;若前缀有 0x 或 0X, 表示为十六进制。
字符型常量:书写时,用单引号括起,如 "a"、"1" 。其整形值对应ASCII码表。转义字符:\0 空字符(NULL)\a 响铃符\b 回退符\f 换页符\n 换行符\r 回车符\t 横向制表符\v 纵向制表符\\ 反斜杠\? 问号\' 单引号\" 双引号\ooo 八进制数\xhh 十六进制数
对于 \ooo 和 \xhh 来说:'\013'——>013(八进制数)——>11(十进制数)——>'\v' (ASCII表)'\0xb'——>0xb(十六进制数)——>11(十进制数)——> '\v' (ASCII表)
常量表达式:仅仅包含常量的表达式, 在编译时即求值,而不是在程序运行时求值。
字符串常量(可看成字符数组)字符串常量也叫字符串字面值,是用 双引号括起的 0个或多个字符组成的 字符序列,以 '\0' 结尾。 strlen 函数可以返回字符串长度,但不包含'\0'。(string.h)双引号不是字符串的一部分,只用于限定字符串。
四、枚举
枚举是一个常量整形值的列表。在没有显示说明(直接赋值)的情况下,enum类型中第一个枚举名的值为 0 ,第二个为 1 ,一次类推。(等差数组)例:enum key {
A,B,C,D=10,E,F}
则:A = 1, B = 2, C = 3, D = 10, E = 11, F = 12.
五、声明
默认情况下, 外部变量与静态变量被初始化为 0;未显示初始化的自动变量的值为未定义值(即无效值)。
任何变量声明均可使用 const 限定符限定。表示该值不能被修改。(修改是指在程序运行过程中无法被程序修改,而不是在编程时程序员修改)
六、运算符(忘了摘自哪里了,见谅=_=!)
简单记就是:! > 算术运算符 > 关系运算符 > && > || > 赋值运算符
优先级 | 运算符 | 名称或含义 | 使用形式 | 结合方向 | 说明 |
1 | [] | 数组下标 | 数组名[常量表达式] | 左到右 | -- |
() | 圆括号 | (表达式)/函数名(形参表) | -- | ||
. | 成员选择(对象) | 对象.成员名 | -- | ||
-> | 成员选择(指针) | 对象指针->成员名 | -- | ||
| |||||
2 | - | 负号运算符 | -表达式 | 右到左 | 单目运算符 |
~ | 按位取反运算符 | ~表达式 | |||
++ | 自增运算符 | ++变量名/变量名++ | |||
-- | 自减运算符 | --变量名/变量名-- | |||
* | 取值运算符 | *指针变量 | |||
& | 取地址运算符 | &变量名 | |||
! | 逻辑非运算符 | !表达式 | |||
(类型) | 强制类型转换 | (数据类型)表达式 | -- | ||
sizeof | 长度运算符 | sizeof(表达式) | -- | ||
| |||||
3 | / | 除 | 表达式/表达式 | 左到右 | 双目运算符 |
* | 乘 | 表达式*表达式 | |||
% | 余数(取模) | 整型表达式%整型表达式 | |||
4 | + | 加 | 表达式+表达式 | 左到右 | 双目运算符 |
- | 减 | 表达式-表达式 | |||
5 | << | 左移 | 变量<<表达式 | 左到右 | 双目运算符 |
>> | 右移 | 变量>>表达式 | |||
| |||||
6 | > | 大于 | 表达式>表达式 | 左到右 | 双目运算符 |
>= | 大于等于 | 表达式>=表达式 | |||
< | 小于 | 表达式<表达式 | |||
<= | 小于等于 | 表达式<=表达式 | |||
7 | == | 等于 | 表达式==表达式 | 左到右 | 双目运算符 |
!= | 不等于 | 表达式!= 表达式 | |||
| |||||
8 | & | 按位与 | 表达式&表达式 | 左到右 | 双目运算符 |
9 | ^ | 按位异或 | 表达式^表达式 | 左到右 | 双目运算符 |
10 | | | 按位或 | 表达式|表达式 | 左到右 | 双目运算符 |
11 | && | 逻辑与 | 表达式&&表达式 | 左到右 | 双目运算符 |
12 | || | 逻辑或 | 表达式||表达式 | 左到右 | 双目运算符 |
| |||||
13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 | 三目运算符 |
| |||||
14 | = | 赋值运算符 | 变量=表达式 | 右到左 | -- |
/= | 除后赋值 | 变量/=表达式 | -- | ||
*= | 乘后赋值 | 变量*=表达式 | -- | ||
%= | 取模后赋值 | 变量%=表达式 | -- | ||
+= | 加后赋值 | 变量+=表达式 | -- | ||
-= | 减后赋值 | 变量-=表达式 | -- | ||
<<= | 左移后赋值 | 变量<<=表达式 | -- | ||
>>= | 右移后赋值 | 变量>>=表达式 | -- | ||
&= | 按位与后赋值 | 变量&=表达式 | -- | ||
^= | 按位异或后赋值 | 变量^=表达式 | -- | ||
|= | 按位或后赋值 | 变量|=表达式 | -- | ||
| |||||
15 | , | 逗号运算符 | 表达式,表达式,… | 左到右 | -- |
注:自增/自减运算符只能作用于变量,不能作用于表达式!!
一些运算符使用时需注意的问题:
- 与运算符“表达式1&&表达式2”:若表达式1为假,则表达式2不会再进行计算,直接判定结果为假。
例:i = 0; j=1;
i && ++j 之后,j 的值仍为1!- 或运算符“表达式1 || 表达式2” :同“与”运算符,此时,若表达式1为真,则表达式2不再计算。
- 自增/自减运算符“++”、“--”:若该符在变量之前,则在变量被使用之前,先自增/自减;若在变量之后,则在变量使用之后,才会自增/自减。
例:i = 1;
a = ( i ++ ) = i;
运算符“? :”表达式1?表达式2:表达式3表达式1为真,则取表达式2;为假则取表达式3.
七、类型转换
分为: 自动转换和 强制转换。
自动转换:把比较”窄”的操作数,转换为比较“宽”的操作数,并且不丢失信息。( “宽”、“窄”按占内存大小而定) 下图为转载
另外,为了节省存储空间、机器执行时间,float不会自动转化为double类型。
赋值运算符右边的值会自动转换成左边变量的类型。
例:int ivar = 10.6; 得出的ivar的值为10;(不四舍五入)
强制转换类型:(!!! 强制转换仅仅是生成一个指定类型的值,被转换的变量或常量本身的值不会改变!!!)
(类型名)表达式
例:fvar = 10.5; (int) fvar = 10;但 fvar 的值仍为10.5.