笔者需要参与一项slam项目的开发,经年不用C++知识已经统统上交给了国家,尤其是现在用python炼丹调参不亦乐乎,怕是一时都改不过来习惯。
故决定速刷C++primer(六)一书,把忘掉的东西捡起来,希望不要和python搞混。
(只是熟悉语法的话看菜鸟教程查表更快,但是为了摸鱼汇报进度还是过一下书吧)
循环
一看到循环就想到迭代,就想到时间复杂度,就想到数据结构。。。。。。。。
前缀与后缀
以递增运算符(++)为例:
int x = 5;
y = x++;//y=5,x=6
z = ++x;//z=6,x=6
前缀格式++x
首先对x进行递增操作,然后将它赋值给其他变量;而后缀格式x++
则是先把x赋值给其他变量,然后再进行递增操作。显然,当它不是表达式(即不赋值给其他变量)时,前缀与后缀在运算结果上没有差别(比如for循环里)。
- 对于用户自定义类,前缀效率更高
- 前/后缀与指针解除优先级相同,从右至左运算;后缀比前缀优先级高。
举个例子:
double x[5]{1.2,2.3,3.4,4.5,5.6};
double* pointer = x;
double y1 = *++pointer;
double y2 = ++*pointer;
double y3 = *pointer++;
double y4 = (*pointer)++;
- 这里
pointer
指向数组x
第一个元素的内存地址,*++pointer
表示先对指针进行递增加一,指向第二个元素地址,然后指针解除取数,所以y1 = 2.3
; ++*pointer
表示先取指针指向的数(第二个元素)(第一步已经改变了指针指向的地址),再对数进行递增,所以y2 = 3.3
;*pointer++
表示先对指针进行递增再解除指针,但是后缀会先给表达式赋值然后才执行递增操作,所以这里解除的指针还没有递增,y3 = 3.3
;(*pointer)++
表示对解除指针后的值进行递增操作,由于上一步指针进行了递增,所以此时指针指向了第三个元素,赋值给y4后才进行递增,所以y4 = 3.4
。
关系表达式
操作符 | 含义 |
---|---|
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
> | 大于 |
注意赋值与关系判断里等于的区别
String比较
对于C风格字符串,使用strcmp
函数,但是用string类会更简单,可以直接string xxx
及xxx != "sdksl"
操作。
For循环
一个典型结构即:
for (初始值;测试表达式;更新循环测试的值)
{
do something...
}
for (int i=0;i<5;i++){
cout<< "hello world";
}
- 设定初始值–>>判断是否应该循环–>>执行循环体内操作–>>更新循环值–>>…–>>…
- 测试表达式最终会转换为bool类型,所以可以设定判断为0终止循环亦可。
- 可以在括号里声明初始值,但是只在for循环里有效哦。
- 循环变量更新可用逗号运算符,使得变量更新支持两组运算操作。
While循环
string name = "Angelbaby";
int i = 0;
while (name[i] != '\0') // process to end of string
{
cout << name[i] << ": " << int(name[i]) << endl;
i++;
}
while循环和for循环几乎等效,一般使用for循环。
do while 循环
do
body
while(test-expression);
出口条件的循环适用范围比较小,作为了解。
文本输入
char ch;
int count = 0;
cin.get(ch); // attempt to read a char
while (cin.fail() == false) // test for EOF
{
cout << ch; // echo character
++count;
cin.get(ch); // attempt to read another char
}
cout << endl << count << " characters read\n";
用cin.fail()
检测是否输入到句尾,cin.get(ch)
获取输入字符,可输入空格等特殊符号。
tips
需要循环输入数字时,循环条件可以while (cin>>val1>>val2)
类型转换判断bool嘛。
二维数组
初始化
实例:大括号
int array1[2][4] = {
{2,4,7,1},{3,2,6,4}
};
使用
通过array1[i][j]
索引即可使用。
相关练习均已上传github。