可执行文件: 由指令和数据构成的集合 (扩展名为.exe .bat .com等)
不可执行文件: 由数据构成
C/C++中, .c/.cpp源文件(文本), .h头文件(文本), .i预编译(文本), .s汇编文件(文本), .o/.obj二进制目标文件(文本), .exe可执行文件
C语言编译链接过程
main.c源文件 ->预编译 -> main.i预编译文件 -> 编译 -> main.obj目标文件 -> 链接-> main.exe可执行文件
程序的执行入口函数是int main()
进制转换
贪心算法 eg.103 -> 128 64 32 16 8 4 2 1 // 0 1 1 0 0 1 1 1
数据类型
sizeof 关键字, 计算变量或数据类型所占的字节个数
字节(byte) 一字节8位二进制构成
2^10 -> 1KB | 2^20 -> 1MB | 2^30 -> 1GB |
---|---|---|
2^40 -> 1TB | 2^50 -> 1PB | 2^60 -> 1EB |
2^70 -> 1ZB | 2^80 -> 1YB | 2^90 -> 1BB |
标识符 (名字)
首字符必须是英文字母或下划线(之后可以是数字)
int a = 100;
int b = 200;
{
int a = 0;
printf("a = %d \n", a); // 0 局部变量与块变量同名时,会把局部变量隐藏
}
b = a + 10;
printf("b = %d \n", b); // 110 块变量在块作用域外面时不起作用
int g_max = 100;
int main()
{
int a = 0;
int g_max = 10;
a = g_max;
printf("a = %d \n", a); // 100
return 0;
}
向上就近原则:
int g_max = 100;
int main()
{
int a = g_max ;
int g_max = 10;
printf("1 a = %d \n", a); // 100
a = g_max;
printf("2 a = %d \n", a); // 10
return 0;
}
scanf 变量需要取地址
printf
char ch;
int a;
float ft;
scanf("%c %d %f", &ch, &a, &ft);
printf("ch = %c a = %d ft = %f \n",ch, a, ft);
常量总结
字面常量 int float… 宏常量 常变量 枚举常量
#include : 包含
#define PI 3.14 : 替换(后面不加分号)
预编译时候 对define进行替换 .i文件 就已经进行了define替换
const 关键字 永恒不变
const int a = 10: // a 不能再次对a赋值 const 放在类型(int)前后都可以
int const a = 10; // 函数内为局部常变量 函数外全局变量
int const a;
c语言中 函数内局部变量未初始化 -> 为随机值; vs2019:局部变量未初始化是不允许读取的(但可以编译通过)
函数外全局变量未初始化 -> 为0
c++语言中 函数内外变量 未初始化 是编译不通过的
const int len = 10;
int ar[len]; // c中 [ ]内只能放常量,const为常变量也是不被允许的
// c++中 常变量可以当作常量使用 (与宏类似)
宏 在预编译时开始替换 是替换不开空间 不会对类型进行检查
常变量 在编译时开始替换 是变量开空间 会对类型进行检查
常变量比宏更加安全
枚举类型 枚举常量 只能给整形(正负都可)若未初始化 下一个枚举元素是上一个值加1
int wx; // 1 2 3 4 5 6 7
限制取值范围
enum week { mon = 1, tue = 2, wed = 3, thu = 4, fri, sat, sun};
// 枚举元素 mon
int main()
{
enum week wx; // 枚举变量 取值范围:枚举元素
wx = mon; // 1
wx = sun; // 7
}
字符常量 字符串常量
字符 0-9 48-57
A-Z 65-90
a-z 97-122
空格 32
回车 13
换行 10
定界符 ’ (字符) " (字符串 \0结尾)
char cha = 'a'; // 存放的是97
char chb = 97;
printf("%d \n", cha); // 97
printf("%s \n", cha); // 97--> 'a'
转义字符 \ 可以将定界符转化成字符
char cha = 0; // 0 空字符 => 0
char chb = '0'; // '0' => 48
char chc = '\0'; // 0
char cdd = ' ' //空格 != 空字符
sizeof 空间大小 \0占空间
strlen 字符串长度 \0不算长度 只要字符串遇到\0就结束
“\141” ( \三位 八进制) => 97 => a
“\x66” (\x三位 十六进制)
1111 1111 => 255(十进制) => 377(八进制) 456超过了377所以不能编译通过