C++ primer plus学习笔记 Day02

第4章 复合类型

P74 4.2 字符串

反斜杠零的用处

C风格字符串在遇到‘\0’,会结束输出。因此可以有以下用法:

#include<iostream>
#include<cstring>

int main() {
	using namespace std;
	const int Size = 15;
	char name1[Size];
	char name2[Size] = "C++owboy";
	cout << "Hello,I'm" << name2 << "!What's your name";
	cin >> name1;
	cout << "你的名字有" << strlen(name1) << "个字符" << endl;
	name2[3] = '\0';	//注意这里的一个技巧通过\0来提前终止
	cout << "前三个字母是" << name2;
}

get()

get()同getline()不同,get不再读取并丢弃换行符而是将换行符留在输入队列中。因此假设我们连续两次调用get

cin.get(name,ArSize);
cin.get(name2,ArSize);

这种情况下,第二个name2则没有读取到任何内容。幸运的是cin.get()在没有任何参数的情况下可以读取下一个字符进行处理,也就是可以将换行符读取掉,为下次输入做准备。

cin.get(name,ArSize);
cin.get();
cin.get(name2,ArSize);

因为cin.get()返回的是一个cin对象,所以可以直接在后面将get()拼接起来使用:
cin.get(name,ArSize).get()

P84 4.3 字符串

C风格字符串的特殊操作

使用strcpy()将字符串复制到字符数组中
使用strcat()将字符串附加到字符串末尾
如果使用string操作字符串:str3 = str1 + str2;
而使用C风格操作字符串时有:

strcpy(charr3,charr1);
strcat(charr3,charr2);

注意:未初始化的字符串数组,使用strlen()计算长度将会是不确定的,因为其将会从数组第一个元素计算起直到遇到空字符
###其它形式的字符串字面值
之前我们学习过wchar_t char16_t char32_t多种特殊类型,C++分别使用前缀L、u和U表示:

wchar_t tittle[] = L"这个是串中文字符";
char16_t name[] = u"随便输的";
char32_t car[] = U"这个也是随便输的";

C++还使用了原视字符串。在原始字符串中,字符串就是字符串本身,例如:‘\n’将不再表示换行。原始字符串用“(和)”用作定界符,如:
cout << R"(Jim "king" \n dajdkal)"
这将会直接输出:Jim “king” \n dajdkal
如果需要显示()呢?使用 R"+(标识原始字符串的开头,用)+"标识字符串的结尾。
##P109 数组的地址
对数组取地址时,数组名不会被解释为地址。数组名被解释为第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址:

short tell[10];
cout << tell << endl;
cout << &tell << endl;

从数字上说这两个地址相同,但在概念上,&tell[0] 表示的是一个两字节的内存块地址,而&tell表示的是一段有20字节内存块的地址。因此对二者加一之后将会有所不同。您可能会这样子声明一个数组
short (*pas)[20] = &tell;
如果省略括号将会导致pas先和[20]结合,导致pas是一个指针数组。由于pas被设置为&tell固(*pas)[0]为tell数组的第一个元素。

第5章 循环和关系表达式

P131 一个阶乘的思路

#include<iostream>

using namespace std;

const int ArSize = 16;
int main() {
	long long a[ArSize];
	a[1] = a[0] = 1LL;
	for (int i = 2; i < ArSize; i++)
		a[i] = i * a[i - 1];
	for (int i = 0; i < ArSize; i++)
		cout << a[i] << endl;
	return 0;
}

P135 自增自减运算符注意点

注意自增自减运算符在执行了完整表达式之后才会执行如下面语句:

#include<iostream>

using namespace std;

int main() {
	int x = 1;
	int y = (4 + x++) + (6 + x++);
	cout << y << endl;
}

4 + x++不是一个完整的表达式,因此C++不保证计算完4 + x++后立即增加1.在这段代码中,整条赋值语句是一个完整表达式,而分号标识了顺序点,因此只保证执行到下一条语句前x被自增两次。
##语法技巧-逗号运算符
在for循环更新中使用逗号运算符:
for( j = 0, i = 1; j<i ; --j ,--i
在所有运算符中,逗号运算符是最低的,如下面的语句:
cat = 17,212 等价于 (cat = 17),212后面的212没有起到作用而被抛弃。
##P143 C风格字符串的比较
strcmp()接受两个字符串地址作为参数。若两字符串相同则返回0,若第一个字符串按字母表顺序在第二个字符串之前,则返回一个负数值,反之则反。
下面这段代码通过循环修改首字母,直到其与“mate”相同为止。

#include<iostream>
#include<cstring>
using namespace std;

int main() {
	char word[5] = "?ate";
	for (char ch = 'a'; strcmp(word, "mate"); ch++) {
		cout << word << endl;
		word[0] = ch;
	}
	cout << "完成替换查找";
}

编写延时循环

long wait = 0;
	while (wait < 1000)
		wait++;

这种方法的问题就是不同的机器有不同的处理速度,所以进行移植时就要修改计数限制。C++中给出了解决方案,定义符号常量——CLOCKS_PER_SEC,该常量等于每秒钟包含的系统时间单位数。因此将clock()获取到的程序执行开始的系统时间数除以单位数就可以得到秒数。clock_t作为clock()返回的类型,如下有个使用示例:

#include<iostream>
#include<ctime>
using namespace std;

int main() {
	cout << "输入一个时间延迟" << endl;
	float secs;
	cin >> secs;
	clock_t delay = secs * CLOCKS_PER_SEC;
	cout << "strating\a\n";
	clock_t start = clock();
	while (clock() - start < delay)
		;
	cout << "结束" << endl;
	return 0;
}

P149 类型别名

注意typedef是类型别名,其本身便是一种类型,不能再添加long short 等修饰。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Godams

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

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

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

打赏作者

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

抵扣说明:

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

余额充值