一个简单程序
跟随黑马程序员C++学习完,有一定基础了开始学习C++Primer第五版
第一个程序
#include<iostream>
using namespace std;
int main()
{
cout<<"hello"<<endl;
return 0;
}
每个C++程序可能会有很多个(function)函数,但是有且只有一个mian,操作系统是通过调用main来运行C++函数的。
函数包括四个部分:返回类型,
int
函数名,
main
一个形参列表(可以为空)
()
以及函数体。
{
cout<<"hello"<<endl;
return 0;
}
std是指命名空间,可以帮助我们避免相同名字冲突,就是你用的东西是谁家的。
using namespace std;
在C++里面要注意符号,比如;,"",以及{},包括中文符号也会报错。
从一个源文件(.cpp)到可执行程序到底经历了哪几步?
编写好以后就需要编译,这取决于用的操作系统和编译器。而编译器一般都具备集成开发环境(IDE),但是是怎么样进行的?
1.进行预编译:这一步就是把你的头文件都拷贝进你的.cpp里面;把你的#define进行替换;处理条件编译指令,带#的;把注释给删除了;保留#pragma编译器命令,因为编译程序需要。*
*1:由于笔记本容量较小,下载的是VSCode,利用MingW进行编译。搜索得知MingW是把开源C语言编译器gcc移植到windows下。
*2:#pragma Para预处理语句(目前只看到#pragma once,只编译一次头文件):作用是设定编译器的状态,或者完成指定动作。比如说让输出窗口输出消息,或者是什么动作做多少次。
2.编译:高级语言翻译成机器语言,即完成词法分析,语法分析,语义分析然后优化为汇编语言(生成.obj文件)*,再转为二进制。
*:汇编语言是可以对硬件进行操作的,相较于机器语言,有相应英文缩写,更容易记忆。
3.链接:将生成的二进制的文件和包含的库(功能?)链接在一起,进行实现。
如何从.c到实现的过程,参考:
https://www.cnblogs.com/mhq-martin/p/11898245.html
(下面是命令行执行示例
$ g++ -o prog1 prog1.cc
$是系统提示符,-o prog1是编译器参数,指定了可执行文件的文件名。在不同的系统中,生成一个prog1 或者prog1.exe的可执行文件。
C:\Users\me\Programs> cl/EHsc prog1.cpp。
C:\Users\me\Programs>指的是你的目录,你现在在哪儿操作。cl是运行编译器命令。/EHsc是编译器选项,用来打开标准异常处理。
*:异常:结构化异常和C++异常
结构化异常:指的是整数/0,访问无效地址 常见代码
EXCEPTION_ACCESS_VIOLATION, EXCEPTION_STACK_OVERFLOW,EXCEPTION_INT_DIVIDE_BY_ZERO
C++异常:又称同步异常,一般是调用API导致
*:/EHsc (EH exception handling异常处理)是 /EHs 和/EHc 的结合
/EHa可以捕捉异常,让后面的东西继续运行,完成局部函数的析构,但是其他不可。但是假设不发生异常(?)太多了,后面专门学习。
关于异常处理命令
**
输入输出
C++没有定义任何输入输出语句,而是包含一个全面的标准库。日常用的是iostream库,包含istream和ostream表示输入流和输出流,表达随着时间的推移,字符是按顺序生成或消耗的。
标准库定义的四个标准对象是cin(输入),cout(标准输出),cerr(标准错误),clog(输出一些程序运行时的消息)。
`
#include<iostream>
using namespace std;
int main()
{
cout<<"请输入两个数字"<<endl;
int a,b;
cin>>a>>b;
cout<<a<<" "<<b;
return 0;
}
而上面的箭头方向也表示字符流向,cout<<是留到显示屏,cin>>留到你留的位置。
endl被称为操纵符,意义是结束当前行,并将与设备相关联的缓冲区刷到设备中。这个动作可以保证产生的所有输出都真正写入输出流中,而不是停在内存等待写入。
注释
两种
//可以单行注释
/*可以多行注释
1111*/
但是他们不能嵌套,要不然就会出现漏网之鱼
控制流
语句都是按顺序执行的,但是有时我们想要不同的顺序,就有控制流语句。
while语句
while( i<10)
{
cout<<i<<" ";
i++;
}
while()里面跟的句子要有真假,满足就继续执行,如果不满足就停下。但是我刷题是遇到
while(nums[i]>j)无法识别的情况,nums是定义好的矢量数组,为什么不能这样呢?后面换成if()else()了就可以了。
for语句
for(int i=0;i<10;i++){int a;cin>>a;}
但是在写循环的时候注意不要越界,对于访问不到的地方记得处理。
有的数据长度不定可以用
while(cin>>a){a+=a;}
一直输入。