Skip to main content

变量 & 运算

Summary

系统汇总 C++ 的变量类型与运算基础,便于随手查阅。先以表格列出各整型与浮点型的字节数及取值上下限,从 bool、char、short 到 int、long long、unsigned long long,再到 float、double、long double,并给出 INT_MAX、LLONG_MAX、DBL_MAX 等对应的极值常量。随后是一张完整的运算符优先级表,从最高的作用域解析符一路排到最低的逗号运算符,共十七个级别,逐一标注运算符、含义、示例代码与是否可重载。末尾收录几个竞赛中常见的位运算写法:用 x&1 判断奇偶、l+r>>1 取两数平均、i>>j&1 取出二进制的某一位。

参考资料​

变量范围​

变量类型字节最大值最小值
bool111100
char11CHAR_MAXCHAR_MIN
signed char11127127
SCHAR_MAX
−128-128
SCHAR_MIN
unsigned char11255255
UCHAR_MAX
00
short223276732767
SHRT_MAX
−32768-32768
SHRT_MIN
unsigned short226553565535
USHRT_MAX
00
int4421474836472147483647
INT_MAX
−2147483648-2147483648
INT_MIN
unsigned int4442949672954294967295
UINT_MAX
00
long4/84/8LONG_MAXLONG_MIN
long long8892233720368547758079223372036854775807
LLONG_MAX
−9223372036854775808-9223372036854775808
LLONG_MIN
unsigned long long881844674407370955161518446744073709551615
ULLONG_MAX
00
float443.40282×10383.40282\times 10^{38}
FLT_MAX
1.17549×10−381.17549\times 10^{-38}
FLT_MIN
double881.79769×103081.79769\times 10^{308}
DBL_MAX
2.22507×10−3082.22507\times 10^{-308}
DBL_MIN
long double16161.18973×1049321.18973\times 10^{4932}
LDBL_MAX
3.3621×10−49323.3621\times 10^{-4932}
LDBL_MIN

运算符优先级表​

第一级别​

运算符描述示例可重载性
::作用域解析符Class::age = 2;否

第二级别​

运算符描述示例可重载性
++后自增运算符for (int i = 0; i < 10; i++) cout << i;是
--后自减运算符for (int i = 10; i > 0; i--) cout << i;是
type() type{}强制类型转换unsigned int a = unsigned(3.14);是
()函数调用isdigit('1')是
[]数组数据获取array[4] = 2;是
.对象型成员调用obj.age = 34;否
->指针型成员调用ptr->age = 34;是

第三级别​

运算符描述示例可重载性
++前自增运算符for (i = 0; i < 10; ++i) cout << i;是
--前自减运算符for (i = 10; i > 0; --i) cout << i;是
+正号int i = +1;是
-负号int i = -1;是
!逻辑取反if (!done) …是
~按位取反flags = ~flags;是
(type)C 风格强制类型转换int i = (int) floatNum;是
*指针取值int data = *intPtr;是
&值取指针int *intPtr = &data;是
sizeof返回类型内存int size = sizeof floatNum; int size = sizeof(float);否
new动态元素内存分配long *pVar = new long; MyClass *ptr = new MyClass(args);是
new []动态数组内存分配long *array = new long[n];是
delete动态析构元素内存delete pVar;是
delete []动态析构数组内存delete [] array;是

第四级别​

运算符描述示例可重载性
.*类对象成员引用obj.*var = 24;否
->*类指针成员引用ptr->*var = 24;是

第五级别​

运算符描述示例可重载性
*乘法int i = 2 * 4;是
/除法float f = 10.0 / 3.0;是
%取余数(模运算)int rem = 4 % 3;是

第六级别​

运算符描述示例可重载性
+加法int i = 2 + 3;是
-减法int i = 5 - 1;是

第七级别​

运算符描述示例可重载性
<<位左移int flags = 33 << 1;是
>>位右移int flags = 33 >> 1;是

第八级别​

运算符描述示例可重载性
<=>三路比较运算符if ((i <=> 42) < 0) ...是

第九级别​

运算符描述示例可重载性
<小于if (i < 42) ...是
<=小于等于if (i <= 42) ...是
>大于if (i > 42) ...是
>=大于等于if (i >= 42) ...是

第十级别​

运算符描述示例可重载性
==等于if (i == 42) ...是
!=不等于if (i != 42) ...是

第十一级别​

运算符描述示例可重载性
&位与运算flags = flags & 42;是

第十二级别​

运算符描述示例可重载性
^位异或运算flags = flags ^ 42;是

第十三级别​

运算符描述示例可重载性
|位或运算flags = flags | 42;是

第十四级别​

运算符描述示例可重载性
&&逻辑与运算if (conditionA && conditionB) ...是

第十五级别​

运算符描述示例可重载性
||逻辑或运算if (conditionA || conditionB) ...是

第十六级别​

运算符描述示例可重载性
? :条件运算符int i = a > b ? a : b;否
throw异常抛出throw EClass("Message");否
=赋值int a = b;是
+=加赋值运算a += 3;是
-=减赋值运算b -= 4;是
*=乘赋值运算a *= 5;是
/=除赋值运算a /= 2;是
%=模赋值运算a %= 3;是
<<=位左移赋值运算flags <<= 2;是
>>=位右移赋值运算flags >>= 2;是
&=位与赋值运算flags &= new_flags;是
^=位异或赋值运算flags ^= new_flags;是
|=位或赋值运算flags |= new_flags;是

第十七级别​

运算符描述示例可重载性
,逗号分隔符for (i = 0, j = 0; i < 10; i++, j++) ...是
tip

表中并未列出 const_cast、static_cast、dynamic_cast、reinterpret_cast、typeid、sizeof...、noexcept 及 alignof 等运算符,因为它们的使用形式与函数调用相同,不会出现歧义。

常见写法​

奇偶性判断​

7 Bcpp
if(x&1)

平均值计算​

15 Bcpp
int mid=l+r>>1;

二进制拆分​

6 Bcpp
i>>j&1