C++ Primer Plus学习笔记:第五章 循环和关系表达式

1.<<的优先级比表达式中其他运算符优先级高


2.bool变量存不了数据

bool a=5;
cout<<int(a);

输出是1,而不是5,可能是这样吧

bool friend operator =(bool a,const& int t){
	if(t==0)a=false;
	else a=true;
}

C++的++运算符的顺序点

我们都知道C++有一个非常简便的++运算符

a++;
++a;

但是这个东西容易弄出一些漏洞,比如下面这个

int a=1;
cout<<a<<++a<<a+1<<a++<<a+1;

按照一般的理解输出应该是

1 2 3 2 4

但是实际的输出却是

1 2 3 2 3

我们知道,++a是先自增后运算,a++是先参加运算后自增,但是是在什么时候自增呢?是在遇到一个顺序点的时候,顺序点这个概念在C++11中已经被废除,这里的顺序点是;,也就是说只有遇到第一个;才会自增

还要注意的是指针的++

int ss[90];
int* int=&ss[0];
it++;

这里的it++不是it的内存加一个,而是加了一个sizeof(int)


{}代码块

在C++循环体中,如果要写好多行,不能像python里边一样通过缩进告诉编译器这是在哪一层循环中,一般需要把代码写在一个用{}括起来的代码块中,在代码块内部,外部同名变量是可以被屏蔽的,同样的,内部变量在每次循环结束后都要被回收
所以,有一个delete自动存储变量的好办法:

stack<int>ss;
...
ss.clear()
{
	stack<int>cle;
	swap(cle,ss);
}

只注意的是在stack中,clear()只能清空stack中的元素,但是不可以释放空间
所以借助{}的机制,我们对ss的空间进行了回收


C++的,运算符

有的时候我们想把两行语句写在一行可以这样写

--a,++b;

当然也可以一行分两行

if (\
i>1\
){
}

这里主要说,运算符
1.,运算符的优先级是最低的,但是仍是自左向右运算
2.不要在特别的时候用,例如:

int name;//————>
int na,me;

3.这个东西看起来没什么用,这是一个实际的用处

for(a=1,b=2.c=3;a>3;i++){
...
}

for和while使用

for一般用在已知循环次数
while一般用在未知循环次数
但是如果你想对一个或者几个用于控制循环的变量进行内存回收的话还是for
还有就是for里面如果第二个表达式是空的的话就认为是true

  • C++11的循环
    C++11新增了基于范围的循环简化了对于数组和一些STL模板类(Vector,array)的访问
double a[10]{1,2,3,4,5,6,7,8,9,0};
for(double i:a)cout<<i;

延时:循环和clock()

1.循环延时

for(int i=0;i<10000;i++);

缺点是对于不同性能的计算机延时不同

2.clock()延时
C++里面提供了一个clock()函数(它被<time.h>头文件收录)可以用于计算程序某个环节运行时间
首先要知道clock()函数的返回值不是秒,而是long或者unsigned int类的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock),那么这个时钟的返回值用什么接受呢?有一个数据类型是clock_t编译器会把他转化为合适的类型,这里我们需要把系统时钟转化为秒的常量CLOCKS_PER_SECOND顾明即可思义,注意一般用clock()定时的循环不要每次都把系统返回时钟转化为秒,太慢了,应该是在for循环上把秒转化为系统时钟


输入的注意事项

  • cin输入
    忽略空行回车,可以直接读入空格,回车作为分割符
  • cin.get(char)
    有的时候我们需要不管他输入多少我只读入一个,而且生写的保留在输入队列,而且cin不报错,这个就需要cin.get(),他会无脑的读入一个字符不管是空格还是回车,所以他一般用来吃空格
    这个和cin.get(char_t,len)是重载了
    cin.get(char_t,len)的char_t是数组地址,len是数组长度
    cin.get(ch)这里的ch接受的是一个char值
  • scanf:
    参考这两个文章
    传送门
    传送门

-文件尾条件
在文件读取的时候,如果程序里面有这样一个代码

char t[20];
while(scanf("%s",t)){
...
}

如果在控制台里边这么干,程序会一直让你输入而不停止,但是如果用文件打开,就不会出现这个问题了,这是因为文件在结尾有一个看不见的标记EOF这个标记表示输入结束,那么在控制台里边如何实现呢?
只需要在控制台输入结束以后输入Ctrl+Z或者Ctrl+D模拟EOF
检测到EOF之后cin将eofbitfilebit设置为1

-注意:
printf和scanf的返回值是print/scanf的元素的个数
cin/cout返回的是一个istream/ostream的对象,例如:

cin>>a>>b;
//相当于先执行
//cin>>a;
//然后将cin>>a的istream的返回值和>>b进行运算
//相当于cin>>b

cin.fail()判断cin是否正常的函数


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liukairui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值