C语言发展历程
C语言的发展历程大致上分为三个阶段:Old Style C、ANSI C(C89)和C99。目前最新的标准是C11。
Ken Thompson和Dennis Ritchie最初发明C语言时有很多语法和现在最常用的写法并不一样,但为了向后兼容性(Backward Compatibility),这些语法仍然在C89和C99中保留下来了。C89是最早的C语言规范,于1989年提出,1990年首先由ANSI(美国国家标准委员会,American National Standards Institute)推出,后来被接纳为ISO国际标准(ISO/IEC 9899:1990),因而有时也称为C90,最经典的C语言教材*TCPL[K&R]*就是基于这个版本的,ANSI C是目前最广泛采用的C语言标准,大多数编译器都完全支持。C99标准(ISO/IEC 9899:1999)是在1999年推出的,加入了许多新特性,在C99推出之后相当长的一段时间里,连GNU GCC也没有完全实现C99的所有特性。
Hello World
#include <stdio.h>
int main(void){
printf("hello, world!\n");
return 0;
}
编译运行
$ gcc hello.c && ./a.out
注释
跨行注释符
/* ... */
无法嵌套,也不能出现在字符串字面量中。单行注释符
//...
从注释开始至该行末尾所有字符都属于注释。无法换行,也不能穿插在代码中间。
单行注释语法从C++中借鉴而来,在C99中被标准化。
标识符
- 标识符是由字母和数字组成的字符序列,但其第一个字符必须为字母或下划线。下划线
_
被看作是字母,通常用于命名较长的变量名,以提高可读性。 - 例程的名字通常以下划线开头,因此变量名不要以下划线开头。
- 大小写敏感;
- 在传统的C语言用法中,变量名使用小写字母,符号常量名全部使用大写字母;
- 对于内部名而言,至少前31个字符是有效的。对于外部名,ANSI标准只保证前6个字符的唯一性,并且不区分大小写。
- 类似于
if
、else
、int
、float
等关键字是保留给语言本身使用的,不能把它们用作变量名。所有关键字中的字符都为小写。
C99规定的关键字:
- | - | - | - | - |
---|---|---|---|---|
auto | break | case | char | const |
continue | default | do | double | - |
else | enum | extern | float | for |
goto | if | inline | int | long |
register | restrict | return | short | signed |
sizeof | static | struct | switch | typedef |
union | unsigned | void | volatile | while |
_Bool | _Complex | _Imaginary | - | - |
运算符
算数运算符
- 二元算数运算符:
+
、-
、*
、/
、%
; - 整数除法会截断结果中的小数部分;
%
运算不能应用于浮点类型(float, double);- 在有负操作数的情况下,整数除法截取的方向以及取模运算结果的符号取决于具体机器的实现,这和处理上溢或下溢的情况是一样的。
- 优先级:一元运算符
+
、-
最高;*
、/
、%
次之;二元运算符+
、-
最低; - 运算符结合规则:从左到右。
关系与逻辑运算符
关系运算符:>
、>=
、<
、<=
它们具有相同的优先级。优先级仅次于它们的是相等性运算符:==
、!=
关系运算符的优先级低于算术运算符 。
逻辑运算符&&
与||
有一些较为特殊的属性,由&&
与||
连接的表达式按从左到右的顺序进行求值,并且,在知道结果值为真或为假后立即停止运算(短路运算)。
逻辑运算符优先级:&&
比||
的优先级高,但两者都比关系运算符和相等性运算符的优先级低。
自增自减运算符
++n
先自增,后取用n++
先取用,后自增
按位运算符
运算符 | 作用 |
---|---|
& |
按位与(AND) |
| |
按位或(OR) |
^ |
按位异或(XOR) |
~ |
按位取反 |
<< |
左移 |
>> |
右移 |
三元运算符
expr1 ?
expr2 :
expr3
判断expr1
的值,如果为真,则结果是expr2
;如果为假,则结果是expr3
。
注意,如果expr2
与expr3
类型不同,结果的类型也将进行转换。
例如,如果f
为float类型,n
为int类型,那么表达式(n > 0) ? f : n
的结果是float类型,与n
是否为正值无关 。
运算符的优先级与结合顺序
运算符 | 结合性 |
---|---|
() [] -> . |
从左至右 |
! ~ ++ -- + - * (type) sizeof |
从右至左 |
* / % |
从左至右 |
+ - |
从左至右 |
<< >> |
从左至右 |
< <= > >= |
从左至右 |
== != |
从左至右 |
& |
从左至右 |
^ |
从左至右 |
| |
从左至右 |
&& |
从左至右 |
|| |
从左至右 |
? : |
从左至右 |
= += -= *= /= %= ^= &= |= <<= >>= |
从右至左 |
, |
从左至右 |
优先级从高到低排列