C++

19-08-25-C++primer-基础学习1

C++

Posted by Wangchenchen on 2019-08-25

目前为止已经做了两年c++,有一个很深的意识就是c++如过没有体统的学习还是对缺少很多的东西,对一些问题会一知半解,痛定思痛,从最基础的开始,一点点的打地基

1. 编写简单c++程序

先编一个基本的main

1
2
3
int main(){
return 0;
}

​ 操作系统通过main执行返回0;正常c++会产生两个文件,一个是以.h(头文件)结尾一个是以.cpp(主体文件) 结尾,.h文件主要包含,成员变量的声明(如果你还不清楚,带着这个疑问看下去,后面会一节会对于他进行详细介绍),.cpp 就是正文部分了,头文件申明,主体文件赋值调用;

2. 编译执行程序

​ 目前c++的编译器有很多,常用的是g++ (很多都都是用gcc[c语言编译器],因为gcc里面包含g++,在做混编时是很有必要的) android studio 的编译器是clang 具体的出门右转编译器那节有简单介绍;

2.1 编译器执行的过程

​ 我们编写的源码是cpp文件,但在电脑,交换机等上面运行的是可执行文件,这个过程我们称为编译过程,有以下几步:

预编译:

​ 首先是源代码文件如:hello.c (c程序源文件)/hello.cpp(c++程序源文件)/hello.h(头文件)被预编译器预编译成 .i 或 .ii 的文件,命令如下(-E表示只进行预编译):

1
gcc -E hello.cpp -o hello.i
编译:

​ 将上面得到的预编译的内容进行一系列语法分析,词法分析,语义分析及优化后生产相应的汇编代码文件,这部分是编译中最重要的部分也是最复杂的部分,我们点击play编译出错绝大多数都是在这步,编译成功后获的 .s 的文件;命令如下:

1
gcc -S hello.i -o hello.s

​ 当前版本的GCC把预编译和编译两个步骤进行了合并,使用叫做ccl和cllplas的程序来完成这两个步骤,这个程序位于“/user/lib/gcc/i486-linux-gnu/4.1/”,直接调用ccl来完成;

1
/user/lib/gcc/i486-linux-gnu/4.1/ccl hello.cpp

或者:

1
gcc -S hello.cpp -o hello.s
汇编:

​ 汇编故名思意就是利用汇编器将上面得到的汇编代码转变成机器指令,命令如下:

1
gcc -c hello.s -o hello.o

如果想直接从源码转化成.o 执行命令:

1
gcc -c hello.cpp -o hello.o

除了上面的还可以另外在找个汇编器单独转化比如 as,这里不做详述;

链接:

​ 链接不单单是对第三方库的映射,更有对程序中的内存映射;

1
gcc -c hello.0 -o hello.exe

或者直接获取可执行文件

1
gcc 文件名.cpp

如果你不指定名字,会在本级目录下默认生成a.exe的可执行文件;运行直接 ./a.exe就可以执行了;

具体的出门左转:c-编译原理 有不错的解释;

3. 输入和输出
3.1 什么是输入和输出?

​ c++并没有直接定义输入和输出(IO)的语句,都是由标准库提供的,比如常用的 iostream库,基础有两种,istream(输入流),ostream(输出流)的类型;

3.2 标准库输入输出对象

​ cin,cout,cerror,clog;分别表示,输入,输出,错误,和打印运行日志;

3.3 举例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
int main(){
int container[5];
for(int i = 0; i != container.length(); i++){
std::cout <<"Enter number"<<std::end1;
std::cin >> container[i];
}
std::cout <<"print container:"<< std::endl;

for(int i = 0; i != container.length(); i++){
std::cout << container[i] <<std::endl;
}
return 0;
}

重点说下,“end1” 这是一个特殊值,称为操纵符,将它写入输出流时,具有输出换行的效果,并刷新于设备关联的缓冲区,通过刷新缓冲区用户可立刻看到写入到流的输出。

3.4 std :

std::cout,std::cin, std::endl; 这些都表示,cout,cin,end1这些都是申明在std这个命名空间的,命名空间有个好处是可以避免和库中定义的名字产生冲突,”::” 这个符号表示的是作用域操作符,例如std::cout,表示:定义在命名空间std中的cout,后面会对命名空间进行详细的解释;

4. 注释

注释一共分为三种 如下:

1
2
3
4
5
6
7
8
// 第一种,常用于单个语句的注释

/*第二种注释,常用于单个语句的注释*/

/**
*第三种注释,常用于方法的注释;
*
*/
5. 条件循环语句,跳出;

​ do…while() ; while() ; if…else; for(); 这些都是在编程时常用不可或缺的编程手段;这一段直接例子+解释:

1
2
3
4
5
6
7
int main(){
int index = 5;
while(2 < index){
index -= 1;
}
return 0;
}

首先会对while括号中的内容进行判断,index 是 5 大于2 所以满足条件会进入 循环体, 下面一句可以看成 index = index -1;这是index就减去一变成 4,这时不是推出是在回到 while语句 再次进行判断,满足条件继续进入,直到不满足条件为止;

1
2
3
4
5
6
7
int main(){
int index = 0;
do{
index += 1;
}while(index > 2);
return 0
}

最初进入main函数,index为0 开始执行do{}的内容,do结束是index的值变为1,后在进行while判断条件是否符合,不符合就不会在执行do的语句;

1
2
3
4
5
6
7
8
9
int main(){
int index = 3;
if(index >3){
/*执行语句1*/
}else{
/*执行语句2*/
}
return 0;
}

程序按顺序执行,当进入先判断if括中的判断条件是否满足,若满足则走执行语句1,若不满足则走执行语句2这时就不会走执行语句1;

1
2
3
4
5
6
7
int main(){
for(int i = 0;i != 5;i++){
/*执行语句1*/
}
/*执行语句2*/
return 0
}

for循环有三个句体,第一个是初始化变量,第二个限定取值范围(如果不设置会死循环),最后一个条件,每次对条件语句进行添加;

break,continue,return 这些都是退语句,不过每个代表不同的功能,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
/*执行语句1*/
while(/*循环语句*/){
if/*判断语句1*/){
continue
}
if(/*判断语句2*/){
break;
}
if(/*判断语句3*/){
return
}
}
/*执行语句2*/

如上,先执行,执行语句1,循环语句条件满足进入循环中,如果满足判端1,则循环本次终止回到while中进行第二次的判断,并且后面两个不会进行判断,第二次循环,满足判断语句2,直接跳出循环直接执行 执行语句2,若第二次循环 满足判断语句3,则结束整个main函数,不会执行执行语句2;

6. 总结:

这篇主要是一些热身,对c++的编译和常用的语句进行了简单的说明,下面一篇,将会对变量和基本类型,和标准库进行输出,写的不好,如果有缘你能看到这篇,希望您能留下宝贵的意见帮助我提高;

邮箱 : jsntwangchenchen@outlook.com 王晨晨