为什么80%的码农都做不了架构师?>>>
变量和常量是程序处理的两种基本数据对象。
声明语句说明变量的名字及类型,也可以指定变量的初值。
运算符指定要进行的操作。
表达式则把变量与常量组合起来生成新的值。
对象的类型决定该对象可取值的集合以及可以对该对象执行的操作。
2.1变量名
命名规则:
(1)由字母和数字组成的序列,第一个字符必须是字母,下划线被看作是字母,通常用于命名较长的变量名,以提高可读性。
(2)由于库例程的名字通常以下划线开头,因此变量名不要以下划线开头。
(3)大写字母与小写字母是有区别的。
(4)C语言中,变量名使用小写字母,符号常量名全部使用大写字母。
(5)局部变量一般使用较短的变量名(尤其是循环控制变量),外部变量使用较长的名字。
2.2 数据类型及长度
(1)
C语言提供了下列几种基本数据类型:
char 字符型,占用一个字节,可以存放本地字符集中的一个字符
int 整型,通常反映了所用机器中整数的最自然长度
float 单精度浮点型
double 双精度浮点型
此外,这些基本数据类型前可以加上short 与long两个限定符。
eg:
short int sh
long int counter
(这种,int可以省略)
(2)
short与long的引入可以为我们提供满足实际需要的不同长度的整型数。
int通常代表特定机器中整数的自然长度。
short类型通常为16位,
long类型通常为32位。
int 类型可以为16位或者32位。
各编译器可以根据硬件特性自主选择合适的类型长度,但是要遵循:
short与int类型至少为16位,
long类型至少为32为。
并且short类型不得长于int类型,而int类型不得长于long类型。
signed与unsigned 用于限定char类型或任何整型。unsigned无符号,总是正值或0,并遵守算术模2n(n次方)定律,其中n是该类型占用的位数。如果char对象占用8位,那么unsiged char类型变量取值范围为0-255,而siged char类型取值范围则为-128-127。
2.3 常量
(1)
类似于1234 ,属于int类型的常量;
类似于123456789L,以字母L或l结尾,属于long类型的常量;
如果一个整数太大以至于无法用int类型表示时,也被当作long类型处理;
无符号常量以字母u或U结尾;
后缀ul或UL表明是unsigned long类型;
(2)
浮点数常量中包含一个小数点或一个指数,也可以两者都有。
没有后缀的浮点数常量为double类型;
后缀有f或F表示float类型;
后缀l或L则表示long double类型;
(3)
整型数除了用十进制表示外,还可以用八进制或十六进制。
带前缀0的整型常量表示为八进制;
带前缀0x或0X的整型常量表示为十六进制;
八进制或者十六进制也可以使用L表示long类型,使用U表示unsigned类型,eg:0XFUL
(4)
一个字符常量是一个整数,如‘x’。
字符在机器字符集中的数值就是字符常量的值。
字符常量一般用来与其他字符进行比较,但也可以像其他整数一样参与数值运算。
某些字符可以通过转义字符序列表示为字符和字符串常量。
转义字符序列看起来像两个字符,但只表示一个字符。
另外,我们可以用‘\ooo’ 表示任意的字节大小的为模式。其中000代表1-3个八进制数字。
这种位模式还可以用‘\xhh’表示。
其中,hh是一个或多个十六进制数字。
ANSI C语言中的全部转义字符序列如下:
\a:响铃符
\b:回退符
\f:换页符
\n:换行符
\r:回车符
\t:横向制表符
\v:纵向制表符
\\:反斜杠
\?:问号
\':单引号
\":双引号
\ooo:八进制数
\xhh:十六进制数
另,字符常量'\0' 表示值为0的字符,也就是空字符串(null)。
我们通常用‘\0’的形式代替0,以强调某些表达式的字符属性,但其数字值为0。
(5)
常量表达式是仅仅只包含常量的表达式。
这种表达式在编译时求值,而不是在运行时求值。
eg:
#define MAXLINE 1000
char line[MAXLINE+1]
(6)
字符串常量也叫字符串字面值,是用双引号括起来的0个或多个字符组成的字符序列。
例如“I am a string” 或“”都是字符串。
双引号不是字符串的一部分,只是用于限定字符串。
字符常量中使用的转义字符序列同样也可以用在字符串中。
编译时,可以将多个字符串常量连接起来,例如,下列形式:
“hello,”“ world” 等价于 “hello, world”
字符串常量的连接为将较长的字符串分散在若干个源文件中提供了支持。
========
从技术角度看,字符串常量就是数组常量。字符串的内部表示使用一个空字符'\0'作为串的结尾,
因此,存储字符串的物理存储单元数比括在双引号中的字符数多一个。
这种表示也说明,C语言对字符串的长度没有限制,但程序必须扫描完整个字符串才能确定字符串的长度。
标准库函数strlen(s)可以返回字符串参数s的长度,但长度不包括末尾的'\0'。
========
我们应该搞清楚字符常量和仅包含一个字符的字符串的区别。
'x'与'X'是不同的。
前者是一个整数,其值是字母x在机器字符集中对应的数值;
后者是一个包含一个字符以及一个结束符'\0'的字符数组。
(7)
枚举常量是另外一种类型的常量。枚举是一个常量整型值的列表。
例如:
enum boolean { NO, YES };
在没有显式说明的情况下,enum类型中第一个枚举名的值是0,第二个是1,一次类推。
如果只指定了部分枚举名的值,那么未指定值的枚举名的值将依着最后一个指定值向后递增。
2.4 声明
所有变量必须先声明后使用,尽管某些变量可以通过上下文隐式声明。
一个声明指定一种变量类型,后面所带的变量表可以包含一个或多个该类型的变量。
eg:
int lower,upper,step;
char c, line[1000];
一个声明语句中的多个变量可以拆开在多个声明语句中声明。因此,也可以
int lower;
int upper;
int step;
char c;
char line[1000];
按照这种形式书写代码需要占用较多的空间,但便于向各声明语句中添加注释,也便于以后修改。
还可以在声明的同时对变量进行初始化。
在声明中,如果变量名的后面紧跟一个等号以及一个表达式,该表达式就充当对变量进行初始化的初始化表达式。
任何变量的声明都可以使用const限定符指定,该限定符指定的变量的值不能被修改。
对数组而言,const指定数组所有元素的值都不能被修改。
2.5 算术运算符
二元算术运算符包括:+ - * / %
整数除法会截断结果中的小数部分。
取模运算符%不能应用于float或double类型。
在有负操作数的情况下,整数除法截取的方向以及取模运算结果的符号取决于具体机器的实现。
【优先级】二元运算符+和-相同优先级 《 二元运算符 * / % 《 一元运算符+ - ;
算术运算符采用从左到右的结合规则。
2.6 关系运算符和逻辑运算符
(1)关系运算符包括:>、 >= 、< 、<=、
它们具有相同的优先级,优先级仅次于他们的是相等性运算符 == !=
关系运算符的优先级比算术运算符底。
(2)
逻辑运算符&& 与|| 。由&&与||连接的表达式按从左到右的顺序进行求值,并且,在知道结果为真或假后立即停止计算。
运算符&&的优先级比||的优先级高,但两者都比关系运算符和相等运算符的优先级底。
因此,表达式i<lim - 1 && (c = getchar()) != '\n' && c != EOF 就不需要加圆括号了。
但是,由于运算符!= 的优先级高于赋值运算符的优先级,因此,在表达式(c = getchar()) != '\n' 中,就需要使用圆括号。
【总结:赋值运算符《 逻辑运算符 《 相等于运算符 《 关系运算符 《 算术运算符】
2.7类型转换
啊啊