C语言学习(一)
起源
1972年, 贝尔实验室的丹尼斯·里奇(Dennis Ritch) 和肯·汤普逊(Ken
Thompson) 在开发UNIX操作系统时设计了C语言。 然而, C语言不完全是里
奇突发奇想而来, 他是在B语言(汤普逊发明) 的基础上进行设计。 至于 B
语言的起源, 那是另一个故事。 C 语言设计的初衷是将其作为程序员使用的
一种编程工具, 因此, 其主要目标是成为有用的语言。
基础规则
示例
1 |
|
变量命名
可以用小写字母、 大写字母、 数字和下划线(_) 来命名。 而且, 名称
的第1个字符必须是字符或下划线, 不能是数字。
有效 | 无效 |
---|---|
wiggles | $Z]** |
cat2 | 2cat |
Hot_Tub | Hot-Tub |
taxRate | tax rate |
_kcab | don’t |
保留字
基本数据类型
-
整数类型int
C语言提供3个附属关键字修饰基本整数类型: short、 long和unsigned。
应记住以下几点。
short int类型(或者简写为short) 占用的存储空间可能比int类型少, 常
用于较小数值的场合以节省空间。 与int类似, short是有符号类型。
long int或long占用的存储空间可能比int多, 适用于较大数值的场合。 与
int类似, long是有符号类型。
long long int或long long(C99标准加入) 占用的储存空间可能比long多,
适用于更大数值的场合。 该类型至少占64位。 与int类似, long long是有符号类型。
unsigned int或unsigned只用于非负值的场合。 这种类型与有符号类型表
示的范围不同。 例如, 16位unsigned int允许的取值范围是0~65535, 而不是-32768~32767。 用于表示正负号的位现在用于表示另一个二进制位, 所以无符号整型可以表示更大的数 -
字符型char
char类型用于储存字符(如, 字母或标点符号) , 但是从技术层面看,
char是整数类型。 因为char类型实际上储存的是整数而不是字符。 计算机使
用数字编码来处理字符, 即用特定的整数表示特定的字符。 美国最常用的编
码是ASCII编码, 本书也使用此编码。 例如, 在ASCII码中, 整数65代表大写字母A。 因此, 储存字母A实际上储存的是整数65(许多IBM的大型主机使
用另一种编码——EBCDIC, 其原理相同。 另外, 其他国家的计算机系统可
能使用完全不同的编码) 。
标准ASCII码的范围是0~127, 只需7位二进制数即可表示。 通常, char
类型被定义为8位的存储单元, 因此容纳标准ASCII码绰绰有余。 许多其他系
统(如IMB PC和苹果Macs) 还提供扩展ASCII码, 也在8位的表示范围之
内。 一般而言, C语言会保证char类型足够大, 以储存系统(实现C语言的系统) 的基本字符集。
许多字符集都超过了127, 甚至多于255。 例如, 日本汉字(kanji) 字符
集。 商用的统一码(Unicode) 创建了一个能表示世界范围内多种字符集的
系统, 目前包含的字符已超过110000个。 国际标准化组织(ISO) 和国际电
工技术委员会(IEC) 为字符集开发了ISO/IEC 10646标准。 统一码标准也与
ISO/IEC 10646标准兼容。
C语言把1字节定义为char类型占用的位(bit) 数, 因此无论是16位还是
32位系统, 都可以使用char类型。转义支付
-
布尔类型
C99标准添加了_Bool类型, 用于表示布尔值, 即逻辑值true和false。 因
为C语言用值1表示true, 值0表示false, 所以_Bool类型实际上也是一种整数
类型。 但原则上它仅占用1位存储空间, 因为对0和1而言, 1位的存储空间足
够了。 -
浮点数(float、 double和long double )
1.声明浮点型变量
浮点型变量的声明和初始化方式与整型变量相同, 下面是一些例子:
float noah, jonah;
double trouble;
float planck = 6.63e-34;
long double gnp;
2.浮点型常量
在代码中, 可以用多种形式书写浮点型常量。 浮点型常量的基本形式是: 有符号的数字(包括小数点) , 后面紧跟e或E, 最后是一个有符号数表示10的指数。 下面是两个有效的浮点型常量:
-1.56E+12
2.87e-3
正号可以省略。 可以没有小数点(如, 2E5) 或指数部分(如,19.28) , 但是不能同时省略两者。 可以省略小数部分(如, 3.E16) 或整数部分(如, .45E-6) , 但是不能同时省略两者。 下面是更多的有效浮点型常量示例:
3.14159
.2
4e16
.8E-5
100.
145
不要在浮点型常量中间加空格: 1.56 E+12(错误! )默认情况下, 编译器假定浮点型常量是double类型的精度。 例如, 假设some是float类型的变量, 编写下面的语句:
some = 4.0 * 2.0;
通常, 4.0和2.0被储存为64位的double类型, 使用双精度进行乘法运算, 然后将乘积截断成float类型的宽度。 这样做虽然计算精度更高, 但是会减慢程序的运行速度。
在浮点数后面加上f或F后缀可覆盖默认设置, 编译器会将浮点型常量看作float类型, 如2.3f和9.11E9F。 使用l或L后缀使得数字成为long double类型, 如54.3l和4.32L。 注意, 建议使用L后缀, 因为字母l和数字1很容易混
淆。 没有后缀的浮点型常量是double类型 。 -
使用数据类型
编写程序时, 应注意合理选择所需的变量及其类型。 通常, 用int或float
类型表示数字, char类型表示字符。 在使用变量之前必须先声明, 并选择有
意义的变量名。 初始化变量应使用与变量类型匹配的常数类型。 例如 :
1 | int apples = 3; /* 正确 */ |
把一个类型的数值初始化给不同类型的变量时, 编译器会把值转换成与
变量匹配的类型, 这将导致部分数据丢失。 例如, 下面的初始化:
1 | int cost = 12.99; /* 用double类型的值初始化int类型的变量 */ |