1. 转义字符 \
在c语言中,有着各种字符是不是能直接使用(', ", \),所有需要转义使用
或者拼上其他字符会出现不一样的含义,下面是常用的转义字符
\' | 表示常量:' |
\" | 表示常量:" |
\\ | 表示常量:\ |
\a | 警告,有蜂鸣声 |
\n | 换行 |
\t | 水平制表符 |
\r | 回车 |
\ddd | ddd表示8进制数,\101转换ascll表字符就是A |
\xdd | ddd表示16进制数, \x41转换ascll表字符就是A |
说明:8进制101转换十进制,1*(8^2)+0*(8^1)+1 = 65
16进制x41转换十进制, 4*(16^1)+1 = 65
#include <stdio.h>
int main() {
printf("1%s\n", "\'");
printf("2%s\n", "\"");
printf("3%s\n", "\\");
printf("4%s\n", "\a");
printf("5-%s-\n", "\n");
printf("6-%s-\n", "\t");
printf("7-%s-\n", "\r");
printf("8%s\n", "\101");
printf("9%s\n", "\x41");
return 0;
}
计算一下 c:\test\328\test.c 的长度,这个长度为14,一个转义字符只站一字符,"\t"算1,
"\328"是8进制数,但8溢出范围了,所以\32和8算两个字符
#include <stdio.h>
#include <string.h>
int main() {
printf("%d\n", strlen("c:\test\328\test.c"));
return 0;
}
2. 数组
数组:相同元素的集合
数组的存储:存储在一条连续的内存空间,int arr[5] = {1, 2, 3, 4, 5};
数组存储方式可以通过指针验证,可以看到指针+1读取的值和数组值的顺序是一样的,11后面的数就不在数组内了
#include <stdio.h>
int main() {
int arr1[5] = { 1, 3, 7, 9, 11 };
int *p = arr1;
for (int i = 0; i < 7; i++) {
printf("%d ", *p);
*p++;
}
return 0;
}
数组有多种声明方式
#include <stdio.h>
int main() {
printf("arr1: ");
int arr1[5] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < 5; i++) {
printf("%d ", arr1[i]);
}
printf("\narr2: ");
int arr2[5] = { 0 };
for (int i = 0; i < 5; i++) {
printf("%d ", arr2[i]);
}
printf("\narr3: ");
int arr3[5] = { 1, 2, 3 };
for (int i = 0; i < 5; i++) {
printf("%d ", arr3[i]);
}
return 0;
}
3. 移位符
移位符有左右之分,原理就是将二进制数据移位,向左移数值会变大,反之右移数值会变小,并且右移有最小值为0
操作 | 值的变化 | ||
左移位符:<< | << 2 | 0000 0001 << 0000 0100 | 1 -> 4 |
右移位符:>> | >> 1 | 0000 0100 >> 0000 0010 | 4 -> 2 |
#include <stdio.h>
int main() {
int a = 1;
int b = a << 2;
printf("%d\n", b);
int c = b >> 1;
printf("%d\n", c);
return 0;
}
3. 单位操作符
3.1. ~按位取反
计算机中存储整数是通过补码的形式,并且正数和负数的规则不一样
正数 | 负数 | |
原码 | 展示数 | 展示数 |
反码 | 和原码一样 | 符号位置不变,其他取反 |
补码 | 和原码一样 | 反码+1 |
#include <stdio.h>
int main() {
int a = 0;
printf("%d\n", ~a);
int b = 2;
printf("%d\n", ~b);
return 0;
}
计算a = 0的按位取反,a = 0二进制表示
00000000 00000000 00000000 00000000 取反 11111111 11111111 11111111 11111111
如下图,计算得到的原码是-1
负数 | |
原码 | 10000000 00000000 00000000 00000001 |
反码 | 11111111 11111111 11111111 11111110 |
补码 | 11111111 11111111 11111111 11111111 |
计算b = 2的按位取反,b = 2二进制表示
00000000 00000000 00000000 00000010 取反 11111111 11111111 11111111 11111101
如下图,计算得到的原码是-3
负数 | |
原码 | 10000000 00000000 00000000 00000011 |
反码 | 11111111 11111111 11111111 11111100 |
补码 | 11111111 11111111 11111111 11111101 |
3.2. ++ --
++:数值+1 , --: 数值-1
++ | -- | |
前置 | ++a:先加算,后赋值 | ++a:先加算,后赋值 |
后缀 | a++:先赋值,后加算 | a++:先赋值,后加算 |