c语言
一 语法
第一章 类型,运算符与表达式
1.变量
1.1 变量名
变量标识符只可以使用字母,下划线以及数字,其中标识符的开头必须是字母或下划线。
下划线开头的变量一般是扩展或实现,用户不应该直接使用。
变量是区分大小写的,我们一般用小写来标识变量,大写来标识常量。
变量名不能与关键字冲突。
1.2 变量与常量
变量是可以变化的,有的时候我们不想要变量被改变,可以使用 #define
定义一个宏,或者使用 const
关键字对变量进行限定。前者是狭义上的常量。
2. 数据类型及长度
2.1 基本数据类型c89
-
char
: 1个字节 -
short
: 2个字节 -
int
: 2 或 4个字节 -
long
: 4 或 8个字节 -
float
: 4 个字节 -
double
: 8 个字节
添加 unsigned
,长度不变,范围则从0开始。
2.2 新增数据类型c99
-
long long
:8 个字节 -
long doble
: 长度不定 -
_Bool
: 1个字节,需要包含stdbool.h
-
int_8
,int_16
,int_32
... 需要包含inttypes.h
3. 常量
3.1 数字类型常量
-
123
: 默认为int
类型的常量, 后缀l
或L
则为long
类型, 如123L
。 - 如果一个数字太大,超过
int
的范围,则被当作long
类型进行处理。 - 无符号常量用
u
或U
进行结尾, 如123u
表示unsigned int
类型,u
/U
可以与l
/L
一起使用, 如1111UL
表示unsigned long int
类型。 -
123.45
: 浮点数默认为double
类型,后缀f
/F
, 则表示为float
类型。
3.2 八进制,十六进制的整型
-
011
: 0开头的数字表示8进制,这里011
即十进制的9
-
0X11
/0x11
:0x
或0X
开头的数字表示16进制整数, 这里的0x11
即 17 - 转义字符: 并不是所有的字符都可以打印出值。
3.3 字符常量
字符常量是整数类型的一种, 因此可以直接与整数进行运算:
char c;
c = 'a';
c += 1;
我们知道字符类型的最长长度为255,整数类型可以用八进制与十六进制标识,字符类型同样可以。
-
'\111'
:char
类型,值为 73, 以下程序打印 173
#include <stdio.h>
int main()
{
int n = 100;
char c = '\111';
printf("n+c: %d", n+c);
return 0;
}
-
\1a
:char
类型, 值为 26
3.4 字符常量
-
abcde
: 字符常量创建的其实是字符数组,末尾自动添加\0
-
\0
: 字符串的结尾, 其值为0
4.枚举常量
- 枚举常量与#define作用类似,但枚举常量有类型检查,不检查赋值是否在合法范围内,只检查类型。
- 枚举常量是一个小范围的整形常量列表
- 枚举常量的默认值是从0开始,第二个为1,如果指定了部分枚举值,则后面的值依次类推。
- 枚举值的名字不能相同,但是值可以相同
#include <stdio.h>
enum DAY {
ONE = 1, TWO = 2
};
int main() {
enum DAY day;
day = 3;
// day: 3
printf("day: %d", day);
return 0;
}
5.声明
5.1 普通类型声明
所有的变量都应该先声明后使用。
-
一个声明指定一种变量类型,后面可以跟1个或多个变量。
#include <stdio.h> int main() { char * name, line[10]; name = "bbb"; line[0] = 'a'; line[1] = '\0'; // line: a, name: bbb printf("line: %s, name: %s", line, name); return 0; }
变量声明时, 指针只是对变量的修饰,与变量是绑定的,并不会影响声明的类型。如上述例子中,
char * name, line[10];
与char * name; char line[10];
效果是相同的。可以在变量进行声明的同时进行初始化。
int c = 100;
变量的初始化是在程序开始之前进行的,因此我们变量的初始化必须是常量表达式。
-
默认情况下, 全局变量/外部变量与静态变量会被初始化为0;未经显示初始化的值为未定义的值。
#include <stdio.h> int g; char name[10]; int main() { int c; // c 每次都是一个随机值, g 固定为 0, name 为空字符串 printf("c: %d, g:%d, name: %s\n", c, g, name); return 0; }
5.2 const
修饰符限定的声明
-
const
修饰基础类型,则该变量的值不能更改。const int c = 100; c = 10; // error: cannot assign to variable 'c' with const-qualified type 'const int'
-
const
修饰数组/字符串指针,则数组的元素不能修改const int nums[10] = {1, 2, 3}; nums[0] = 100; // error: cannot assign to variable 'nums' with const-qualified type 'const int [10]'