运算符
1. 在c++中有4种运算符明确规定了运算对象的求值顺序。分别是:“&&”、“||”、“,”、“?:”。
2. 运算符的结合性是指相同优先级的运算符在同一个表达式中,且没有括号的时候,运算符和操作数的结合方式,通常有从左到右 结合和从右到左结合两种方式。假设~是一个运算符,又有表达式a~b~c,如果~是左结合的,那么该表达式被解析为(a~b)~c,如 果~是右结合的,那么该表达式将被解析为a~(b~c)。赋值运算满足的是右结合律。
3. 对于%(看清楚,/运算没有要求必须是整数类型)运算符,运算对象必须是整数类型。还有需要注意的是,在新标准中,(-m)/n 和m/(-n)都等于-(m/n),而m%(-n)等于m%n,(-m)%n等于-(m%n)。
4.sizeof运算符返回一条表达式或一个类型名字所占的字节数。所得的是一个size_t(无符号类型,数组的大小和下标类型都是size_t)类型的常量表达式。要注意,当sizeof运算符作用于表达式的时候,返回的是表达式结果类型的大小,而不是计算其 运算对象的值。
<1> 对引用类型执行sizeof运算得到的是被引用对象所占空间的大小。
<2>对指针执行sizeof运算符运算得到的是指针所占空间的大小,此时不管指针属于什么类型,均为8字节数。
#include <string>
using namespace std;
int main()
{
int *p;
char *q;
cout << sizeof(p) << " " << sizeof(q) << endl;
system("pause");
return 0;
}
<3> 对解引用执行sizeof运算得到指针指向的对象所占空间的大小,指针不需要有效。也就是说,在sizeof的运算对象中解引用一个无效指针仍然是一种安全的行为。
<4> 对数组执行sizeof运算得到整个数组所占空间的大小。注意,sizeof运算不会把数组名转换成指针来处理。所以,数组的维度通sizeof(a)/sizeof(*a) 来计算得出。
#include <iostream>
using namespace std;
int main()
{
int a[5];
size_t i = sizeof(a) / sizeof(*a);
cout << i << endl;
system("pause");
return 0;
}
<5> 对string对象或vector对象执行sizeof运算只返回该类型固定部分的大小,不会计算对象中的元素占用了多少空间
表达式
1.C++中的表达式要么是左值要么是右值,一个左值表达式的求值结果是一个对象或者一个函数。当一个对象被用作右值的时候,用的是对象的值(内容);当对象被用作左值的时候,用的是对象的身份(在内存中的位置)。
2.constexptr和常量表达式
<1> 常量表达式是指值不会改变并且在编译过程就能得到计算结果的表达式。
<2> C++11新标准规定,允许将变量声明为constexptr类型以便由编译器来验证变量的值是否是一个常量表达式。声明为constexptr的变量一定是一个常量,而且必须用常量表达式初始化。
<3> 在constexptr声明中如果定义了一个指针,限定符constexptr仅对指针有效,与指针所指的对象无关。
const int *p=nullptr; //p是指向整型常量的指针
constexptr int *q=nullptr; //q是一个指向整数的常量指针