4.3 逻辑和关系运算符
1.用&&保证不越界
if(index!=s.size()&&!isspace(s[index]);
判断s中的字符是否不是空白字符,前面index若到最后了直接不进代码块,避免越界
2.范围for中不修改但用常量引用:避免浪费内存空间
for(const suto &s:text)
{
cout<<s;
if(s.empty()||s[s.size()-1]=='.')
{
cout<<endl;
}
else
{
cout<<" ";
}
}
text是vector<string> 类型
遇到空字符串或以句号结尾的字符串进行换行
text中的字符串可能有很多,不加引用每次都拷贝一份出来太浪费内存,也影响cpu执行效率
又不想通过s修改字符串,所以const aotu &s,常量引用
3.!vec.empty() 非空
4.判断i<k,并且k>j
if(i<j<k)
i<j 真 bool与int比 先转换 1<K
i<j 假 bool与int比 先转换 0<K
正确:i<j&&j<k
5.真值比较
if(val==true)
不好!
1.没有(val)简洁
2.!!!如果val不是bool值,则只有val==1时才为真(实际上不为0就为真)
val与true比较,val是int,则bool转为int,转为1 val只有==1才为真,失去原来的意义
除非val是布尔类型,不然不要这样写
4.4 赋值运算符
1.类型不同,右侧转为左侧
k=0;
k=3.14;
k为3
2.窄化转换:对于内置类型的变量,使用{}赋初值,若存在丢失信息风险会报错
k={3.14};编译器报错
!!!对于内置类型的变量,使用{}赋初值,若存在丢失信息风险会报错
3.vector可用{}赋值是重载了=和{},其若为<int> 不赋初值为0
4.右结合律
int ival,jival;
ival=jval=0;
先jval=0;
再ival=jval;
所以ival=0;
5.while((i=get_value())!=42) 加括号
6.混淆==与=
这样用
if(3==i)
一旦混淆3=i,编译器还会报错
4.5 递增与递减运算符
1.*it++,见之前文章有详细讲解:C++ Primer 4.1 基础 4.2 算数运算符-CSDN博客
2.求值顺序:C++ Primer 4.1 基础 4.2 算数运算符-CSDN博客
4.6 成员访问运算符
1.*的优先级优于.
练习题
4.9 有疑问未解决:*cp是H吗 是H 问题已解决
#include<iostream>
using namespace std;
int main(void)
{
const char* cp="hello";
cout<<*cp;
if(cp&&*cp)
{
}
return 0;
}
判断条件是 cp不为空指针,cp的值不为空
4.12
i!=j<k
!!! 先看优先级
<优先级更高
最后判断是(j<k是真是假)
i!=0
i!=1
4.18 结果:少输出一个,造成越界
因为*++ptr 是先++再返回
4.20 (f)
iter++->empty()
判断iter指向的字符串是否为空,若真,再加加
优先级:->优于++
后置++优于前置++
更新
12.29 更新4.9未解决的问题 *cp就是H