终于要开学了,记录一下学到的一些C++的知识,传闻最难的语言之一,我来挑战你了!
1.准备开发环境
我使用的是VS Code来进行编程,官方文档,博客参考这两个教程即可完成配置,不知为何百度很多教程都说安装完VS code再安装个扩展就配置好了,全都是骗人的,让我懵逼了好长时间,真是!复杂也不是很复杂,一步步来就可以配置。记得要添加环境变量哦( ̄▽ ̄)/
(更新:用Visual Studio了,因为弄了好久也没解决中文乱码的问题,哭了)
2.hello world详解
打印出‘hello world’是每一个编程语言学习的第一部,可以说是一种信仰了。让我们将hello world的全部句子都做一个解析吧!
先说明一下,.c
是C语言文件的后缀,.cpp
是C++的后缀,刚开始我还傻乎乎的吧.c
当成C++的后缀。。。
#include <iostream>
using namespace std;
// main() 是程序开始执行的地方
int main()
{
cout << "Hello World"; // 输出 Hello World
return 0; //因为主程序被声明为int数据类型,所以必须返回(return)一个值。
}
- #:告诉编辑器要预处理 include:表引入头文件
<iostream>
:一个定义I/O流的文件,即输出流/输入流 (一般都要引入) 有两个引入方法:<>
:编译环境的默认路径‘’
:同文件夹内 - using namespace std:使用名为
std
的命名空间,此命名空间包含C++的基本功能;
:终止语句符,表示一个逻辑表达式的结束,相当于中文的句号。(或用std::
表示变量) - //: 注释符号
/* */
:此为多行注释 - Main函数是入口,程序是从int main()开始执行,无需参数,需返回整数,使用
void main()
:无参数,不返回值 -
大括号{}
:函数的主体,即函数的开始与结束 -
cout
:访问流对象 <<:输出右边的内容到显示器(不包含引号) >>:输出左边的 -
return 0
: 程序中的最后一条指令语句,终止main()函数,并返回0给调用的进程。非零值(通常为1)表示异常终止。(没有return也是可以运行的,但是程序大了会有不良影响,要养成好习惯) - 其他补充:
endl
:换行符(也可以用/n
) 区别:endl 时会刷新缓冲区,使得栈中的东西刷新一次,但用 “\n” 不会刷新,它只会换行,建议用endl
(备注:C++编译器是忽略空行和空格的,打代码时需注意可读性,方便维护,不要单单能运行就可以了)
上面的信息都非常重要,请牢牢记住!
扩展使用:
多行输出:
{
cout << "Hello world!" << endl;
cout << "I love 古客!"; //多行输出时,这个是正常都会运用的表达,但有更加方便的表达方法
return 0;
}
{
cout<<"Hello, world!\n"
<<"I love 古客!";
return 0;
}
当然,有可能会输出汉字会出现乱码,解决方法挺复杂的,看得懂得就看吧!(更惨的是有时候会乱码,有时候不会,只能放弃我美好的中文了)
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
cin>>str;
cout<<str<<endl;
return 0;
}
(额,我也不是很懂,下次再补充吧,查了下,感觉要扩展很多知识,只能先放着了,看得懂英文的看一下这个)
更新,后文有其他解决办法
字符格式 | 说明 |
---|---|
‘\0’ | 产生空字符 |
‘\a’ | 产生嘟声 |
‘\b’ | 回退 |
‘\r’ | 转到下一个定位点 |
‘\n’ | 换行 |
‘\r’ | 回车,跳到该行起点 |
‘\’’ | 插入单引号 |
cin>>的用法:
cin可以连续从键盘读取想要的数据,以空格、tab或换行作为分隔符。实例程序如下。
#include <iostream>
using namespace std;
int main()
{
char a;
int b;
float c;
string
cin>>a>>b>>c;
cout<<a<<" "<<b<<" "<<c<<" "<<endl;
system("pause");
return 0;
}
(看到这个不知道有没有人跟我一样想到这个可以用来做游戏,像贪吃蛇,打飞机那样的小游戏,有时间可以试试(ノ ̄▽ ̄))
注意:变量命名不能以数字作为开头
下面为进阶的表示:
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"}; //
for (const string& word : msg)
{
cout << word << " ";
}
cout << endl;
}
vector
:是向量类型,可以容纳许多类型的数据
string
: 定义了一个变量类型、一个宏和各种操作字符数组的函数
补充知识:
C++ 中,分别使用.h 和.cpp 来定义一个类。
.h 中存放类的声明,函数原型(放在类的声明中)。
.cpp 存放函数体。
<> 先去系统目录中找头文件,如果没有在到当前目录下找。所以像标准的头文件 stdio.h、stdlib.h 等用这个方法。
“ “ 首先在当前目录下寻找,如果找不到,再到系统目录中寻找。 这个用于 include 自定义的头文件,让系统优先使用当前目录中定义的。
可能出现的问题
弹出窗口一闪而过,完全看不见输出了什么
解决:在对应位置添加如下代码
include <cstdlib>
system("pause"); //在main函数里
目的是让程序输出结果暂停,等用户按下任意键后才会退出程序的输出窗口。
3.各种数与变量的认识与使用
进制的转换
先讲讲进制转换的原理,我们能够不借助工具也可以转换并可以验证计算机的答案。
$(1001)_2$ $\Rightarrow$ $2^3+02^2+02^1+2^0$ =9
十进制转其他就是取余数就可以了
十六进制:10-15用A-F表示
(原本还想写清楚一些,但是打数学公式实在是太麻烦了,相信大家一定懂了(*´゚∀゚`)ノ )
接下看一下如何用程序进行转换。
Python版(这个我熟悉一些)
dec = int(input("输入十进制的数字:"))
print("十进制数为:",dec)
print("转换为二进制为:", bin(dec))
print("转换为八进制为:", oct(dec))
print("转换为十六进制为:", hex(dec))
C语言版
十进制转换为八进制
#include <stdio.h> //定义了三个变量类型、一些宏和各种函数来执行输入和输出
#include <math.h> //引入数学计算
int convertDecimalToOctal(int decimalNumber);
int main()
{
int decimalNumber;
printf("输入一个十进制数: ");
scanf("%d", &decimalNumber);
printf("十进制数 %d 转换为八进制为 %d", decimalNumber, convertDecimalToOctal(decimalNumber));
return 0;
}
int convertDecimalToOctal(int decimalNumber)
{
int octalNumber = 0, i = 1;
while (decimalNumber != 0)
{
octalNumber += (decimalNumber % 8) * i;
decimalNumber /= 8;
i *= 10;
}
return octalNumber;
}
八进制转换为十进制
#include <stdio.h> //定义了三个变量类型、一些宏和各种函数来执行输入和输出
#include <math.h>
long long convertOctalToDecimal(int octalNumber);
int main()
{
int octalNumber;
printf("输入一个八进制数: ");
scanf("%d", &octalNumber);
printf("八进制数 %d 转换为十进制为 %lld", octalNumber, convertOctalToDecimal(octalNumber));
return 0;
}
long long convertOctalToDecimal(int octalNumber)
{
int decimalNumber = 0, i = 0;
while(octalNumber != 0)
{
decimalNumber += (octalNumber%10) * pow(8,i);
++i;
octalNumber/=10;
}
i = 1;
return decimalNumber;
}
(C语言我不太懂,这是菜鸟课程的)
整数常量
整数常量可以是十进制、八进制或十六进制的常量。前缀指定基数:0x 或 0X 表示十六进制,0 表示八进制,不带前缀则默认表示十进制。
整数常量也可以带一个后缀,后缀是 U 和 L 的组合,U 表示无符号整数(unsigned),L 表示长整数(long)。后缀可以是大写,也可以是小写,U 和 L 的顺序任意。
浮点常量
浮点常量由整数部分、小数点、小数部分和指数部分组成。您可以使用小数形式或者指数形式来表示浮点常量。
当使用小数形式表示时,必须包含整数部分、小数部分,或同时包含两者。当使用指数形式表示时, 必须包含小数点、指数,或同时包含两者。带符号的指数是用 e 或 E 引入的。
4.一些性质和概念
运算符
算术运算符
假设变量 A 的值为 10,变量 B 的值为 20,则:
运算符 | 描述 | 实例 |
---|---|---|
+ | 把两个操作数相加 | A + B 将得到 30 |
- | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 |
* | 把两个操作数相乘 | A * B 将得到 200 |
/ | 分子除以分母 | B / A 将得到 2 |
% | 取模运算符,整除后的余数 | B % A 将得到 0 |
++ | 自增运算符,整数值增加 1 | A++ 将得到 11 |
– | 自减运算符,整数值减少 1 | A– 将得到 9 |
比较不一样的就是++和–了,这个有前缀和后缀两种写法
前缀形式与后缀形式之间有一点不同。如果使用前缀形式,则会在表达式计算之前完成自增或自减,如果使用后缀形式,则会在表达式计算之后完成自增或自减。
#include <iostream>
using namespace std;
int main()
{
int a = 21;
int c ;
// a 的值在赋值之前不会自增
c = a++;
cout << "Line 1 - Value of a++ is :" << c << endl ;
// 表达式计算之后,a 的值增加 1
cout << "Line 2 - Value of a is :" << a << endl ;
// a 的值在赋值之前自增
c = ++a;
cout << "Line 3 - Value of ++a is :" << c << endl ;
return 0;
}
引用
5.实例
输入输出与交互
#include <iostream>
using namespace std;
int main()
{
int a ,b ,c; //声明变量
cout << "请输入第一个数a:" << endl;
cin >> a; //监视键盘输入值并赋值与a
cout << "请输入第二个数b:" << endl;
cin >> b;
cout << endl <<"交换前" << endl <<"a为:" << a << endl << "b为:" << b << endl;
c = a;
a = b;
b = c;
cout << endl <<"交换后"<< endl <<"a为:" << a << endl << "b为:" << b << endl;
}
输出结果:

可能出现的问题
运行此程序时我们可能会遇到如下问题:

这个是因为输出是只能用来看的,要输入得切换到终端!
在设置中搜索run code config ,将run in terminal打勾即可。

你以为就可以使用了吗?不不不,其实你还会遇到终端显示乱码的问题。
VSCode终端其实调用的是cmd.exe,所以当这里出现中文乱码的时候要解决的是cmd的编码设置问题。
打开cmd,通过chcp
命令查看cmd的编码设置,GBK2312的代码页编号是936,然后改成utf-8的编码即可,utf-8对应的代码页编号是65001,所以执行chcp 65001
就可以把cmd的编码设置成uft-8了,这样就解决了乱码问题。
当我以为这样就可以大功告成之后,结果。。。


我去,算你狠,在百度一番,在各路大神的指导下仍然无果之后,只能放弃了。。(;д;)(我果然还是太蠢了吗。)
更新:使用visual studio成功解决,电脑配置比较差的建议使用2017或2015版本。(虽然大了不少,但使用起来方便,只好放弃VS code了。。)
闰年的判断
#include <iostream>
using namespace std;
int main(){
int year;
bool lsLeapYear;
cout << "Enter the year: ";
cin>>year;
lsLeapYear = (year % 4 == 0 &&
year%100!=0)||(year%400==0);
if (lsLeapYear)
cout <<year <<" is a leap year" <<endl;
else
cout<<year<<" is not a leap year"<<endl;
return 0;
}
终极方案
既然如此,那就不能怪我使用终极方案了,不管你是什么破电脑和系统,只要能成功运行浏览器,你就再也不用担心配置不好环境的问题了ヽ(・ω・´メ)
没有什么是在线工具无法解决的问题,如果有,那就两个!
https://c.runoob.com/compile/12 (推荐,对各种代码的应对措施较好)
但是上面那两个没有交互功能,下面这个有,可惜全是英文
https://www.bccn.net/run/(这个也有,是中文)
(吐槽下:C++的编译速度是真的慢,跟python没法比,而且用起来还好麻烦,需要想很多底层的事)
6.题目
来看下C++的一些测试题目吧,加深些记忆!
1.源代码文件、目标文件的作为是什么?
源代码文件是一种纯文本文件,扩展名为“*.cpp”,是用户自行编写的源代码。源代码可以使用各种文本编辑器或C/C++语言的集成开发环境(例如Dev C++)来进行编辑。这种文件可在各种平台中使用不同的编译程序来编译成可执行文件。目标文件则是用户开发的程序在经过编译程序编译后产生的机器码,主要让计算机明白应该执行的指令与操作。虽然目标文件中已经包含机器码,不过通常还需要链接程序来链接函数库文件(*.lib)与其他程序的目标文件才行。
2.试说明main()函数的功能。
main()是一个相当特殊的函数,代表着任何C++程序的进入点,也唯一且必须使用main作为函数名称。也就是说,当程序开始执行时,一定会先执行main()函数,而不管它在程序中的位置,编译程序都会找到它开始编译程序的内容,因此main()又称为“主函数”。
3.在Dev C++中,可否声明为void main()?
虽然语法逻辑正确,但是有些系统却不能编译通过,例如本书所使用的Dev C++就不行,因此本书中将所有C++程序中的main()函数都声明为int类型。
(VS家的可以)
4.链接程序(链接器)的功能是什么?
由于用户编译的C++程序中可能会使用到函数库(扩展名为*.lib)中的函数,或者一个程序可能分为数个文件来开发,这些文件在编译为目标文件后,必须通过链接程序(linker,或称为链接器),最后才会产生可执行文件(扩展名为*.exe)
5.试说明编译程序与解释程序的不同之处。
编译程序可将源代码程序分为数个阶段转换为机器可读的可执行文件。经过编译后,会产生“目标文件”(.obj)和“可执行文件”(.exe)两个文件。源代码程序每修改一次都必须重新编译。不过,经过编译后所产生的可执行文件可直接对应成机器码,故可在计算机上直接运行,不需要每次运行时都重新翻译,因而运行速度自然较快。解释器(Interpreter)可对高级语言的源代码进行逐行的解释执行,每解释完一行程序代码并执行完后才会再解释下一行。由于使用解释器翻译的程序每次执行时都必须再翻译一次,因此运行速度较慢。不过因为仅需存取原始程序,不需要再转换为其他类型文件,所以所占用的内存较少。
简单地说:解释程序:边编译边执行(如JAVA)
编译程序:是编译完再执行
6.当我们将程序编写完毕之后,应如何将程序编译成可执行文件?该执行文件放置在哪一个目录中?
将程序分别进行Compile和Build的操作,系统会在当前项目下的“Debug”目录下产生可执行的文件。
7.C++的编写规则可分为哪四个部分?
预处理区、程序区块、程序语句和程序注释。
8.编译阶段的主要工作是什么?
编辑器会将预处理器处理过的程序编辑产生机器码(又称为“目标文件”),而此文件的扩展名为“*.obj”。所谓的目标文件,就是用户开发的源代码在经过编译程序编译后所产生的一堆机器码,可让计算机明白应该执行的指令与操作。虽然目标文件中已经包含机器码,不过通常还得多一步功夫,就是需要链接程序来链接函数库文件(*.lib)与其他程序目标文件才行。
9.C++、Visual C++以及C++ Builder三者间的关系是什么?
C++是一种程序语言,Visual C++及C++ Builder则是分别由Microsoft与Borland公司所开发出来的支持C++的程序开发工具。
10.说明错误类型
(1)语法错误这是在程序开发过程中最常发生的错误。语法上的错误在程序编译时会发生编译时错误(compile time error),编译程序会将错误显示在“输出窗口”中,程序开发人员可以根据窗口上的提示迅速找出错误位置并加以修正。
(2)逻辑错误逻辑错误是程序中最难发现的臭虫(bug)。这类错误在编译时并不会出现任何错误信息,必须要依靠程序开发人员自行判断。这与程序开发人员的专业素养、经验和细心程度有着密不可分的关系。例如,薪资的计算公式、财务报表等,这些都必须在开发过程中以数据进行实际测试来确保日后程序运行结果的准确性和精确性。
11.如何在程序代码中使用标准链接库所提供的功能?
在程序代码中使用标准链接库的功能,必须要先以预处理器指令#include包含对应的头文件。
附录:
C++ 关键字
下表列出了 C++ 中的保留字。这些保留字不能作为常量名、变量名或其他标识符名称。
asm | else | new | this |
---|---|---|---|
auto | enum | operator | throw |
bool | explicit | private | true |
break | export | protected | try |
case | extern | public | typedef |
catch | false | register | typeid |
char | float | reinterpret_cast | typename |
class | for | return | union |
const | friend | short | unsigned |
const_cast | goto | signed | using |
continue | if | sizeof | virtual |
default | inline | static | void |
delete | int | static_cast | volatile |
do | long | struct | wchar_t |
double | mutable | switch | while |
dynamic_cast | namespace | template |
基本的内置类型
C++ 为程序员提供了种类丰富的内置数据类型和用户自定义的数据类型。下表列出了七种基本的 C++ 数据类型:
类型 | 关键字 |
---|---|
布尔型 | bool |
字符型 | char |
整型 | int |
浮点型 | float |
双浮点型 | double |
无类型 | void |
宽字符型 | wchar_t |