编译器在运行代码的时候,会且只会运行main函数 初学者先不用去管什么是函数,只是知道有这么个东西就好了,那三条注意事项也不必深究 注意1:main函数不能包含在任何结构或者类里面(C#的情况其他博客会讲) 注意2:main函数的名字只能叫main,不能叫其他的名字 注意3:main函数的定义告诉我们:一个源代码(包括导入的头文件)中有且只有一个函数叫做main 示例如下:
int main() { return 0; }同样,初学者也不用管 return 0;是什么意思,其他博客会有写)
首先,一个“预”字说明它是在整个程序开始编译前就执行的,事实上,不管预编译指令在代码的哪个位置,它总是最先被编译 并且,预编译指令是对编译器“下命令”,就像老板先要对员工下特定的命令,员工才能按照指示去干活
1、一定要以 # 开头 2、每个预编译指令单独占一行 3、行末不加分号 示例:
include <bits/stdc++.h> //非法,预编译指令一定要以 `#` 开头 #include <bits/stdc++.h> //合法 #define N 100000 #define M 15000 //非法,每个预编译指令单独占一行 #define K 1e9; //非法,行末不加分号include ,字面的意思是“包括”,而它的实际意思也是把指定的文件契合到代码中,就好比小明和小红是一家(在一个文件中),小刚和小梅是一家(也在同一个文件中),户口普查时,有人告诉工作人员(也就是编译器),小明是小刚家的,那么,工作人员(编译器)就会很自然的把小明、小红、小刚、小梅分到一家(也就是一起编译)
格式如下:
#include <cstdio> //表示在系统指定的目录下查找一个名为"cstdio"的文件,并导入到编译器中 #include <bits/stdc++.h> //表示系统指定的目录下的"bits"目录下查找一个名为"stdc++.h"的文件,并导入到编译器中 #include "cstdio" //表示先在用户目录下查找一个名为"cstdio"的文件,如果找不到再在系统指定的目录下查找,并导入到编译器中以下两种方式等价:
/*文件1:名字叫做"abc.h"*/ int abc(int a, int b, int c) { return (c >= a) && (c >= b); } /*文件2:也就是要编译运行的代码*/ #include "abc.h" int main() { int a = 10, b = 20, c = 50; cout << abc(a, b, c); //此时输出1 return 0; } int abc(int a, int b, int c) { return (c >= a) && (c >= b); } int main() { int a = 10, b = 20, c = 50; cout << abc(a, b, c); //此时输出1 return 0; }在程序设计中,常常要一个东西写好几次,感觉烦,(复制粘贴更烦), 怎么办? 我们可以把一个很长很复杂的东西用一个短一点的东西来代替! 而且并不是我们去查找替换,而是编译器去做! 所以,要用到预编译指令 define就是专门做这个的
注意事项: 1、只有#define 后面的第一个字符串会被替换! 2、类型不限,只要能输入代码,编译器就能给你替换 3、三字符组(不懂的就baidu)编译器会自动替换,无需手写
格式:(以下两个代码等价)
int main() { unsigned long long int a = 1000000000; unsigned long long int b = 1000000000; unsigned long double d = 10000000.00000; unsigned long double e = 10000000.00000; } #define LL unsigned long long int #define UD unsigned long double #define 1+11 10000000000 #define 1.09 10000000.00000 int main() { LL a = 1+11; LL b = 1+11; UD d = 1.09; UD e = 1.09; }注意:请仔细阅读以下两个程序:
#include <iostream> int main(){ int a; a = 1; //运行之后a会等于多少??????/ a = 2; cout << a; //输出1 return 0; } #include <iostream> int main(){ int a; a = 1; //运行之后a会等于多少??????/ a = 2; cout << a; //输出2 return 0; }为什么? 因为 ??/ 就是一个三字符组,编译器自动把他替换成 \ 而在注释行后面加 \ 是会把下面一行也换成注释的,所以第一个程序里a并没有被赋值为2
初学者如果没学过分支结构,可直接跳过 在学分支结构的时候,大家肯定熟练的掌握了以下代码:
int main() { int a; cin >> a; if (a < 0) cout << "negative"; else if (a == 0) cout << "zero"; else cout << "positive"; return 0; }可是大家知不知道,这段代码和上面的代码等价?:
int main() { int a; cin >> a; #if a < 0 cout << "negative"; #elif a == 0 cout << "zero"; #else cout << "positive"; #endif return 0; }其实,他们的实现原理都是一样的 但是,他们之间有天差地别! 区别: 1、编译层面: 预处理分支是提前处理的,普通分支结构是运行时处理的 2、作用范围层面: 预处理分支的作用范围是不受任何限制的,普通分支结构只能在函数内部