更新时间:2021.11.25 知识点:
- 数据类型
- 变量和常量
- 字符串、转义字符和注释
- 选择语句
- 循环语句
- 函数
- 数组
- 操作符
一、基本数据类型
七种基本类型:char、short、int、long、long long、float、double.在64位机器下经sizeof测试后的占用空间情况如下:
数据类型 | 占用空间大小 (byte) |
---|
char | 1 | short | 2 | int | 4 | long | 4 | long long | 8 | float | 4 | double | 8 |
二、变量和常量
2.1 变量
- 局部变量:定义在大括号内部的变量。
- 全局变量:定义在大括号外部的变量。
当两者名字冲突时(允许但不提倡),局部变量优先。
2.2 常量
2.2.1 字面常量
3.1415926
2.2.2 const修饰的常变量
注意,虽然被const修饰的变量不可更改,但其本质仍然是变量而非常量,由于初始化数组不能用变量,所以下面用数组的初始化来测试:
const int n = 10;
int arr2[n] = { 0 };
2.2.3 #define定义的标识符常量
#define MAX 10000
2.2.4 枚举常量
enum Week
{
Monday = 2,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday,
Sunday
};
enum Week week = Monday;
printf("%d\n", week);
printf("%d\n", Tuesday);
printf("%d\n", Friday);
printf("%d\n", Sunday);
运行结果:
尝试更改枚举值,发现报错:
三、字符串+转义字符+注释
3.1 字符串
C语言中通过定义字符数组的方式实现字符串。结束标志:\0。 下面定义三种不同的字符串:
char arr1[] = "abc";
char arr2[] = { 'a','b','c' };
char arr3[] = { 'b' ,'\0'};
printf("arr1中元素:%s\n",arr1);
printf("arr2中元素:%s\n",arr2);
printf("arr3中元素:%s\n",arr3);
printf("arr1长度:%d\n", strlen(arr1));
printf("arr1数组长度:%d\n", sizeof(arr1) / sizeof(arr1[0]));
printf("arr2长度:%d\n", strlen(arr2));
printf("arr2数组长度:%d\n", sizeof(arr2) / sizeof(arr2[0]));
printf("arr3长度:%d\n", strlen(arr3));
printf("arr3数组长度:%d\n", sizeof(arr3) / sizeof(arr3[0]));
运行结果:
debug一下: 可以看到: 当用"abc"方式定义时,结尾处默认添加了 ‘\0’ ,因此可以正常打印出结果。 当用{ ‘a’,‘b’,‘c’ }方式定义时,由于没有加上 ‘\0’ ,因此用%s打印字符串时找不到结束标志,所以会一直在内存中继续找下去,直到找到 ‘\0 ‘才结束打印,这个过程完全不可预测的,随机的。 当用{ ‘b’ ,’\0’}方式定义时,手动添加了结束标志 ‘\0’ ,因此可以正常打印结果。 此外,可以发现结束标志 ‘\0’ 是不算做字符串长度的,但是算作数组的长度。
3.2 两个较重要的转义字符
- \ddd:其中ddd表示1-3个八进制数字。
- \xdd:其中dd表示2个十六进制数字。
printf("%c\n", '\101');
printf("%c\n",'\x41');
printf("%d\n", strlen("c:\test\328\test.c"));
运行结果:
3.3 注释
I have nothing to say!
四、选择语句
五、循环语句
六、函数
七、数组
八、操作符
- 算术操作符:+ 、-、*、/、% 等 注意/,操作数至少有一个为小数,结果为小数,否则取商,即使以%f打印。
- 移位操作符:>>、<< 等,移动的是二进制位。
- 位操作符:按位与&、按位或|、按位异或^、按位取反~ 等。
- 赋值操作符:=、+=、*=、%=、<<= 等 。
单目操作符:++、–、!、强制类型转换、&、sizeof()等,注意sizeof不是 函数,括号内为变量时,可省略括号,为数据类型时不可省略。 - 关系操作符:==、!=、>=、<= 等。
- 逻辑操作符:&&、||
- 条件操作符:exp1 ? exp2 : exp3;
- 逗号表达式:exp1,exp2,exp3,…,expn;从左向右依次计算,表达式结果为最后一个表达式的结果。
- 下标引用、函数调用和结构成员操作符:[]:数组访问元素 、():实际上,函数名后边的圆括号就是操作符。
几个易错操作符:
8.1 左移操作符
int a = 2;
int b = a << 2;
printf("%d", b);
结果为:8。 位操作符操作的是二进制位,先将用int存储的2用二进制表示,共4*8=32bit:
00000000 00000000 00000000 00000010 左移两位: 00000000 00000000 00000000 00001000 1*2^3 + 0 + 0 + 0 = 8
8.2 取反操作符
int a = 0;
printf("%d\n",~a);
结果为:-1。 整数在内存中是以补码的形式存储,而打印出来的是原码,因此需要将补码转化为原码。 正数的原码、反码、补码相同;负数将其原码按位取反得到其反码,反码+1得到补码。
a:00000000 00000000 00000000 00000000 ~a:11111111 11111111 11111111 11111111 此时的~a为补码形式,将其-1得到其反码: [~a]反:11111111 11111111 11111111 11111110 符号位为1,负数,除符号位将其按位取反得到原码: [~a]原:10000000 00000000 00000000 00000001 即 -1
8.3 区分&&与&
- &&是逻辑运算,其两个操作数表示“真(非0)”或“假(0)”,将真假作与运算;
- &是位运算,将两个操作数按位作与运算。
if (1 && 2) {
printf("true");
}
else {
printf("false");
}
1和2均为真,结果为真,即ture:
if (1 & 2) {
printf("true");
}
else {
printf("false");
}
1:00000000 00000000 00000000 00000001 2:00000000 00000000 00000000 00000010 1&2:00000000 00000000 00000000 00000000 即 0 ,为假
一百、结束
内容不全,以后会持续更新,欢迎探讨,若有错误还望各位批评指正!
|