会飞的鱼

2020
Godam
首页 » 学习笔记 » C++ primer plus Day02

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;

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;

第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,若第一个字符串按字母表顺序在第二个字符串之前,则返回一个负数值,反之则反。

#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 等修饰。

文章如无特别注明均为原创! 作者: 果果, 转载或复制请以 超链接形式 并注明出处 GODAM|博客|godam
原文地址《 C++ primer plus Day02》发布于2020-6-7

分享到:
打赏

评论

游客

切换注册

登录

您也可以使用第三方帐号快捷登录

切换登录

注册

sitemap