C++第5章-循环和关系表达式
2021-03-05 08:26
标签:算术运算 std string tab 本质 就会 ali 下一步 字符串翻转 主要知识点:递增/递减运算符。 分为前缀(prefix) 从上面也可以看出,前缀的速度要比后缀高。后缀是比较难理解的,我们结合例子去解释: 第4行其实可以先 所以对于 程序在执行完第4行后,要对所有的副作用进行评估,便会把副本+1的结果赋给a,执行完第4行后,a的值更新为了21。也就是说:顺序点执行完成后,后缀运算才会把副本+1的值赋给本身。 对于for循环的自增操作,比如 首先 这里主要涉及优先级问题, 设 如果在一个语句块内声明一个变量,而外部语句块中也有一个这种变量,如下面所示: 从第4行声明新变量开始,到这个语句块结束,新变量将隐藏旧变量。结束后该变量再次可见。 执行效果:输入 第10行中使用逗号同时操作 也可以这样写 逗号运算符有如下三个特点: C++第5章-循环和关系表达式 标签:算术运算 std string tab 本质 就会 ali 下一步 字符串翻转 原文地址:https://www.cnblogs.com/rongyupan/p/14327988.html第5章-循环和关系表达式
5.1 for循环
cout.setf(ios_base::boolalpha)
:通常,cout在显示bool值之前都会转换成int,此函数设置了一个标记,命令cout显示true或false,而非1或0。递增/递减运算符
++i
,后缀(postfix)i++
。
i
加1,然后把i+1
赋给i
;i
复制一个副本,将副本的值加1,然后把副本的值i+1
赋给i
。int a = 20;
int b = 20;
cout
int c = a++;
,便可以写成cout ,也就是输出的是c的值,那么为什么c是20而不是21呢?
首先从运算的优先级上讲,递增运算高于赋值操作,所以a先复制一个副本并+1,但是什么时候把这个副本值赋给a呢?执行完顺序点!接下来引入副作用和顺序点。
int c = a++;
来说,后缀操作只能执行到副本+1这一步,之后就要执行把值a赋给c这步,而此时a的值仍是20,所以c的值也是20。++b
就没有上面那么麻烦了,执行完后就会直接更新b的值。for(int i=0; i,我们可以看到括号里是用的分号隔开,这意味着每个表达式的末尾是个顺序点,所以执行完
i++
后,就完成了把副本+1的值赋给i的这个过程。递增/递减和while循环
int guests = 0;
while(guests++
guests++ 的末尾是个顺序点,当
guests=0
是,执行完这个顺序点guests=1
,传给下面的cout打印;直到guests=9
,执行完顺序点后guests=10
,此时便不符合guests++ 这个条件了,程序结束。
递增/递减和指针
*
运算符的优先级相同,故整体上从右向左结合;*
。pt->arr[0]
,可以总结如下:
常见类型
解释
*++pt;
先运算
++pt
,则pt->arr[1]
,然后取arr[1]
的值
++*pt;
先取
*pt
即arr[0]
的值,然后++arr[0]
(*pt)++;
括号优先级最高,所以先取
*pt
即arr[0]
的值,然后arr[0]++
*pt++;
先执行
pt++
,结合上文此时pt->arr[0]
,然后取arr[0]
的值,这句执行完后(顺序点)才有pt->arr[1]
语句块和变量
int x = 10;
{
cout
逗号运算符和字符串翻转
#include
stressed
,输出desserts
。这个代码在string类有更好的实现方式,但现阶段可以先参考这个使用。i
和j
,这是逗号运算符。允许把两条或更多语句放在C++语法只允许放一个表达式的地方。第10行的本质是把这两个合成为1个。int j=0, i=word.size()-1;
也能取得同样的效果,但这里的,
就是列表分隔符,而不是逗号运算符。同样的还有第9行中,int i, j
同时初始化i
和j
,也是分隔列表中的变量。
i=20, j=2*i
则有i=20, j=40
;(cat=70), 240
执行括号中的表达式,240没什么作用。cat=(70, 240)
:这个表达式结合上面的第二点,cat=240
。关系运算符
x+3 等价于
(x+3) 。这是因为关系运算符的优先级低于算术运算符。
字符串的比较