最近落了好多没写了,感觉已经废了。继续C++的笔记,关于range-based for loop的使用,一个C++11的标准。首先我会给出样例,然后针对gcc的报错,说明Ubuntu16.04-LTS下gcc的更新方法。

range-based for loop

C++11标准中增加了一种新的for循环的方式,称为range-based for loop,即基于范围的for循环,这个类似于python中直接进行列表索引的for循环。请看下面的样例,分别是C++和python的for循环写法,

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
using namespace std;
int main()
{
int numArray[5] = {0, 11, 22, 33, 44};
for (int num : numArray)
cout << num << endl;
return 0;
}
python
1
2
3
4
numArray = [0, 11, 22, 33, 44]
for num in numArray:
print(num)

二者的输出结果均为如下形式,

1
2
3
4
5
0
11
22
33
44

显然,相对于C99的for循环,基于范围的这种for循环能够减少多行代码量。

g++ update

为了应用C++11/14的新标准,gcc/g++也需要做相应的更新,由于我还在Ubuntu-16.04 LTS的坑里,gcc的最高版本为5.4。如果编译时看到如下的警告,则需要对gcc进行更新。

1
warning: range-based ‘for’ loops only available with -std=c++11 or -std=gnu++11

更新方法如下,

1
2
3
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-7 g++-7

Reference

Comment and share

cpp notebook 1

生成CPP应用程序的步骤,

  1. 编写cpp代码;
  2. 使用编译器对代码进行编译,将代码转换为包含在目标文件中的机器语言版本;
  3. 使用链接器链接编译器的输出,生成可执行文件,如.exe

编译器每次转换一个代码文件,都会生成一个扩展名为.o.obj的目标文件,忽略这个cpp文件与其他文件中代码的依赖。解析这些依存关系的工作由链接程序负责。

集成开发环境 (integrated development environment, IDE)
Tip:online IDE

强烈安利visual studio code,一个轻量级的IDE,支持多种语言(java, python, c/c++)以及文本编辑器(vim)。

下面以’Hello World’来入门,并说明VS code的使用步骤,还是有点麻烦的。。。

  1. MinGW
  2. GNU C++

CPP中,一条语句可以跨越多行;还可在一行中包含多条语句,只要每条语句都以;结尾

预处理器编译指令#include

1
2
#include <> // 标准头文件
#include "..." // 用户自建的头文件

除非明确声明了不返回值,否则函数必须有return语句

名称空间的概念:给代码指定的名称,有助具降低命名冲突的风险。
例如std,用来调用获得ISO标准委员会批准的函数、流和工具给代码指定的名称,有助具降低命名冲突的风险。
例如std,用来调用获得ISO标准委员会批准的函数、流和工具。其声明方法是”using namespace”

C++中的main函数必须返回int,没有void main这种定义方式,

1
2
int main(void)
int main(int argc, char *argv[])

定义变量
VariableType VariableName;
VariableType VariableName = InitialValue;
变量类型向编译器指出了变量可存储的数据的性质,编译器将为变量预留必要的空间。

最高有效位 most significant bit
最低有效位 least significant bit

新特性

C++14的chunking separator,即用但引号作为组块分隔符,例如

1
int x = 100'000;

测试了一下,gcc-7.2支持这一新的标准,但是gcc-5.5还不支持,Check 一下

sizeof 用于确定变量的长度,是个运算符。。。

1
sizeof(int)

C++11中引入的列表初始化避免缩窄转换错误,造成执行中隐藏的bug
例如,如下的代码,就会有这样的警告,并且无法编译通过,但直接写就不会警告

1
2
3
4
...
int16__t largeNumber = 257;
int8_t smallNumber = largeNumber; // No warning
int8_t smallNumberList = {largeNumber}; // warning| narrowing conversion of

auto自动推断类型
如果使用的编译器支持C++11或更高的版本,可以不显式地指定变量的类型,即

1
auto flag = True; // flag将被设定为bool

注意:使用auto时,必须对变量进行初始化。

使用typeof替换变量类型
C_++允许将变量类型替换为认为方便的名称,例如

1
2
typedef unsigned int STRICTLY__POSITIVE_INTEGER;
STRICTLY_POSITIVE_INTEGER num = 1234;

Comment and share

  • page 1 of 1
Author's picture

Jason Ma

We are in the same story.


Astronomer? Software engineer


Shanghai