C++温故补缺(二十):杂项补充1

发布时间 2023-06-01 15:54:02作者: Tenerome

杂记1

布尔型

c语言中表示布尔型一般用0/1,或者flag,c++把布尔型内置了,布尔型的变量只有true和false 两个值

和0/1的关系:

true和false不是0/1,c++编译器会把非0处理成true,把0处理成false

宽字符型

char型只有一个字节的长度,如果要在c中表示汉字,则需要使用字符串数组

c++添加的宽字符型就是专门用来存储汉字,日文,韩文等占两个字节字符的.

wchar_t的本质:

typedef short int wchar_t;

是的,它和short int有相同的2个字节空间.

使用前需要导入头文件<locale>,并需要用setlocale(LC_ALL,"chs");指定中文

如:

wchar_t c[]=L"你好";
wcout<<c;

L:是常量的前缀,L表示宽字符

wcout也是针对wchar_t的输出

常量的前缀和后缀

常量的前缀像上面说的L,用来表示宽字符,这是字符型的常量,除此之外,还有:

整型前缀:0x表示十六进制

0表示八进制

整型后缀:U表示无符号数

L表示长整数(long)

缺省的参数

在定义函数时可以在形参中为其赋值,表示这个参数可缺省

void f(int x,int y=1){
    cout<<x+y;
}
int main(){
    f(3);
}

缺省的参数必须放在其他的参数后面

restrict

restrict关键字,规定被其修饰的指针所指的对象不能被其他指针引用

在C++中用__restrict来修饰指针

int a;
int* __restrict p=&a;

这样,变量a就只能被指针p所指,不能被其他指针指

作用:有些时候可以优化性能,见知乎

存储类

和C相同都有auto,extern,static,register存储类,并新增mutable和thread_local(C++11)

auto:C语言中auto用来声明函数内的变量,C++98标准中和C相同.C++11后,auto用来定义自动推导的类型,且必须在定义时赋初值.

int a=1;
float b=1.2;
auto c=a;
auto c=b;

编译器会根据给赋初值的类型推导auto变量的类型,常用于lambda表达式,这样lambda的返回类型就可以省略

mutable用于类中,用mutable修饰的成员变量可以被const函数修改

thread_local:

thread_local说明符声明的变量仅可以在创建其的线程上访问.变量在创建线程时创建,在销毁线程时销毁.

与其他几个存储类不同的是,thread_local只能用于修饰变量,不能修饰函数

杂项运算符

运算符 描述
sizeof sizeof 运算符返回变量的大小。例如,sizeof(a) 将返回 4,其中 a 是整数。
Condition ? X : Y 条件运算符。如果 Condition 为真 ? 则值为 X : 否则值为 Y。
, 逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。
.(点)和 ->(箭头) 成员运算符用于引用类、结构和共用体的成员。
Cast 强制转换运算符把一种数据类型转换为另一种数据类型。例如,int(2.2000) 将返回 2。
& 指针运算符 & 返回变量的地址。例如 &a; 将给出变量的实际地址。
* 指针运算符 * 指向一个变量。例如,*var; 将指向变量 var。

其中,逗号运算符例子:

#include<iostream>
using namespace std;
int main(){
    int a=0;
    int j;
    j=(a++,a-99,a+2);
    cout<<j;
}

逗号运算符必须在括号中,它的意义是先从左到右运算,最后把最右边的值返回

这个例子输出:3

先运算a++ =>a=0,然后运算a-99,a-99并不会对a做影响,所以无效,最后返回a+2,也就是3

最终a的值为1,j的值为3