变量和常量是程序处理的两种基本数据对象。
声明语句说明变量的名字及类型,也可以指定变量的初值。
运算符指定将要进行的操作。
表达式则把变量与常量组合起来生成新的值。
对象的类型决定该对象可取值的集合以及可以对该对象执行的操作。
变量名
变量名使用小写字母,符号常量名全部使用大写字母。下划线“_”被看做是字母。所有关健字中的字符都必须小写。
选择的变量名要能够尽量从字面上表达变量的用途,这样做不容易引起混淆。局部变量 一般使用较短的变量名(尤其是循环控制变量)
数据类型及长度
C 语言只提供了下列几种基本数据类型:
- char 字符型,占用一个字节,可以存放本地字符集中的一个字符
- int 整型,通常反映了所用机器中整数的最自然长度
- float 单精度浮点型
- double 双精度浮点型
此外,还可以在这些基本数据类型的前面加上一些限定符。short 与 long 两个限定符 用于限定整型:
- short int sh;
- long int counter;
在上述这种类型的声明中,关键字 int 可以省略。通常很多人也习惯这么做。
常量
ANSI C 语言中的全部转义字符序列如下所示:
符号 | 意义 |
---|---|
\a | 响铃符 |
\\ | 反斜杠 |
\b | 回退符 |
\? | 问号 |
\f | 换页符 |
\’ | 单引号 |
\n | 换行符 |
\" | 双引号 |
\r | 回车符 |
\ooo | 八进制数 |
\t | 横向制表符 |
\xhh | 十六进制数 |
\v | 纵向制表符 |
字符常量
一个字符常量是一个整数,书写时将一个字符括在单引号中,如,‘x’。字符在机器字符 集中的数值就是字符常量的值。
字符常量’\0’表示值为 0 的字符,也就是空字符(null) 。我们通常用’\0’的形式代替 0, 以强调某些表达式的字符属性,但其数字值为 0。
常量表达式是仅仅只包含常量的表达式。这种表达式在编译时求值,而不在运行时求值。 它可以出现在常量可以出现的任何位置。
字符串常量
字符串常量也叫字符串字面值,是用双引号括起来的 0 个或多个字符组成的字符序列。
我们应该搞清楚字符常量与仅包含一个字符的字符串之间的区别:‘x’与"x"是不同的。 前者是一个整数,其值是字母 x 在机器字符集中对应的数值(内部表示值); 后 者是一个包含 一个字符(即字母 x)以及一个结束符’\0’的字符数组。
枚举常量(enum)
枚举常量是另外一种类型的常量。枚举是一个常量整型值的列表。
在没有显式说明的情况下,enum 类型中第一个枚举名的值为 0,第二个为 1,依此类推。如果只指定了部分枚举名的值,那么未指定值的枚举名的值将依着最后一个指定值向后递增,不同枚举中的名字必须互不相同。同一枚举中不同的名字可以具有相同的值。
#include <stdio.h>
#include <stdlib.h>
void main() {
//枚举
enum months {JAN=1,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC};
printf("%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC);
system("pause");
}
输出结果
1,2,3,4,5,6,7,8,9,10,11,12
请按任意键继续. . .
类型转换
强制类型转换
(类型名称)表达式
我们可以这样来理解强制类型转换的准确含义:在上述语句中,表达式首先被赋值给类型名 指定的类型的某个变量,然后再用该变量替换上述整条语句
强制类型转换符和一元运算符的运算等级是一样的
自增运算符和自减运算符
++n是先把n加上1,然后使用n
n++是先使用n,然后给n加1
按位运算符
符号名 | 含义 |
---|---|
& | 按位与(AND) |
| | 按位或(OR) |
^ | 按位异或(XOR) |
<< | 左移 |
>> | 右移 |
~ | 按位求反(一元运算符) |
赋值运算符与表达式
x *= y + 1
的含义是:
x = x * (y + 1)
而不是
x = x * y + 1
赋值表达式的类型是它的左操作数的类型,其值是赋值操作完 成后的值
条件表达式
条件表达式(使用三元运算符“? :”)提 供了另外一种方法编写这段程序及类似的代码段,在表达式
expr1 ? expr2 : expr3
中,首先计算 expr1,如果其值不等于 0(为真),则计算 expr2 的值,并以该值作为条件 表达式的值,否则计算 expr3 的值,并以该值作为条件表达式的值。expr2 与 expr3 中只 能有一个表达式被计算。
z = (a > b) ? a : b; /* z = max(a, b) 求Z的最大值*/
应该注意,条件表达式实际上就是一种表达式,它可以用在其它表达式可以使用的任何 地方;如果 expr2 与 expr3 的类型不同,结果的类型将由本章前面讨论的转换规则决定
运算符优先级与求值次序
- 同一行中 的各运算符具有相同的优先级,各行间从上往下优先级逐行降低。例如,*、/与%三者具有相 同的优先级,它们的优先级都比二元运算符+、-高。运算符( ) 表 示 函数调用。
运算符的优先级与结合性
运算符 | 结合性 |
---|---|
( ) [ ] -> . | 从左至右 |
! ~ ++ - - + - * (type) sizeof | 从右至左 |
* / % | 从左至右 |
+ - | 从左至右 |
<< >> | 从左至右 |
< <= > >= | 从左至右 |
== != | 从左至右 |
& | 从左至右 |
^ | 从左至右 |
| | 从左至右 |
&& | 从左至右 |
|| | 从左至右 |
? : | 从左至右 |
= += - = *= /= %= &= ^= |= <<= >>= | 从右至左 |
, | 从右至左 |
注:一元运算符+、-、&与*比相应的二元运算符+、-、&与*的优先级高。
注意,位运算符&、^与|的优先级比运算符==与!=的低。