基础类型
C++中的基本类型如下:
整数类型
int
:整数类型。short
:短整数类型。long
:长整数类型。long long
:长长整数类型。- 上述类型的
signed
和unsigned
版本。
浮点类型
float
:单精度浮点类型。double
:双精度浮点类型。long double
:扩展精度浮点类型。
字符类型
char
:字符类型。signed char
andunsigned char
:有符号和无符号字符类型。
布尔类型
bool
:表示真或假的类型。
空类型
void
:表示没有类型。通常用作不返回值的函数的返回类型。
初始化
int myInt = 42;
short myShort = 123;
long myLong = 123456789L;
long long myLongLong = 1234567890123456789LL;
unsigned int myUnsignedInt = 42u;
unsigned short myUnsignedShort = 123u;
unsigned long myUnsignedLong = 123456789ul;
float myFloat = 3.14f;
double myDouble = 3.14;
long double myLongDouble = 3.14L;
char myChar = 'A';
bool myBool = true;
类型提升
如果 int
可以表示较小整数类型(如 char
或 short
)的所有值,则在执行操作之前将较小的类型提升转换为 int
。
例如:
char c = 'A';
int result = c + 1; // 'A' (char) 在加法之前提升为 int
int i = 5;
float f = 2.5f;
float result = i + f; // int 在加法之前提升为 float
类型限定符
类型限定符是修改变量或对象属性的关键字。
const
const
限定符用于指定变量在初始化后不能更改其值,即常量。
const int x = 5; // x 是整数常量
volatile
volatile
限定符表示变量的值可以由外部力量(例如硬件或程序的其他部分)随时更改。
volatile int sensorValue; // 变量可能被异步更改(例如,通过硬件中断)
mutable
mutable
限定符用于类成员变量,表示即使其包含对象是 const
的,该成员变量也可以被修改。
class Example {
public:
mutable int counter; // 即使在 const 成员函数中也可以修改
};
restrict
restrict
限定符用于 C99 及更高版本,表示指针是访问特定对象的唯一方式,有助于编译器执行某些优化。
void exampleFunction(int* restrict a, int* restrict b);
存储类别说明符
存储类别说明符是定义变量的存储期限、链接性和作用域的关键字。
auto
auto
说明符用于声明自动变量。它很少被显式使用,因为编译器会自动推断变量的类型。
auto x = 42; // 编译器推断 x 的类型
register
register
说明符建议编译器将变量存储在CPU寄存器中以便快速访问。
然而,现代编译器通常忽略此建议,因为它们在寄存器分配方面已经非常高效。
register int count = 0; // 建议将 'count' 存储在寄存器中
static
static
说明符根据其上下文具有不同的含义:
- 用于局部变量时,使变量在函数调用之间保持其值不变。
- 用于全局变量时,将变量的作用域限制为声明它的文件。
- 用于函数时,表示仅限内部链接。
static int globalVar = 10; // 限制在文件范围内
void exampleFunction() {
static int localVar = 5; // 在函数调用之间保持其值不变
}
extern
extern
说明符用于声明在另一个源文件中定义的变量或函数。
extern int globalVar; // 声明在另一个文件中定义的全局变量
extern void externalFunction(); // 声明在另一个文件中定义的函数
Typedef
typedef
用于为现有类型创建别名或同义词。它可使复杂的类型声明变得更可读和可维护。
#include <iostream>
typedef int myInt;
int main() {
// 使用 typedef 别名
myInt x = 42;
std::cout << "Value of x: " << x << std::endl;
return 0;
}
或者,在现代C++(C++11及更高版本)中,你可以使用 using
关键字来设置类型别名:
#include <iostream>
using myInt = int;
int main() {
// 使用类型别名
myInt x = 42;
std::cout << "Value of x: " << x << std::endl;
return 0;
}
位操作
位操作用于操作整数值的每一个 bit
(位)。
位运算符包括与(&
)、或(|
)、异或(^
)、取反(~
)、左移(<<
)和右移(>>
)。
#include <iostream>
int main() {
// 位与 (&)
int a = 5; // 二进制: 0101
int b = 3; // 二进制: 0011
int result_and = a & b; // 二进制: 0001 (1 十进制)
std::cout << "Bitwise AND: " << result_and << std::endl;
// 位或 (|)
int result_or = a | b; // 二进制: 0111 (7 十进制)
std::cout << "Bitwise OR: " << result_or << std::endl;
// 位异或 (^)
int result_xor = a ^ b; // 二进制: 0110 (6 十进制)
std::cout << "Bitwise XOR: " << result_xor << std::endl;
// 位取非 (~)
int result_not_a = ~a; // 二进制: 11111111111111111111111111111010 (assuming 32-bit integer)
std::cout << "Bitwise NOT for a: " << result_not_a << std::endl;
// 位左移 (<<)
int result_left_shift = a << 1; // 二进制: 1010 (10 十进制)
std::cout << "Left Shift: " << result_left_shift << std::endl;
// 位右移 (>>)
int result_right_shift = a >> 1; // 二进制: 0010 (2 十进制)
std::cout << "Right Shift: " << result_right_shift << std::endl;
return 0;
}
复合赋值
C++ 中的复合赋值运算符将算术或位运算与赋值结合在一起。它提供了一种简洁的方式执行操作并将结果赋给变量。
#include <iostream>
int main() {
int a = 5;
a += 3; // 等同于: a = a + 3
std::cout << "a after addition: " << a << std::endl;
a -= 2; // 等同于: a = a - 2
std::cout << "a after subtraction: " << a << std::endl;
a *= 4; // 等同于: a = a * 4
std::cout << "a after multiplication: " << a << std::endl;
a /= 2; // 等同于: a = a / 2
std::cout << "a after division: " << a << std::endl;
a %= 3; // 等同于: a = a % 3
std::cout << "a after modulus: " << a << std::endl;
a &= 1; // 等同于: a = a & 1
std::cout << "a after bitwise AND: " << a << std::endl;
a |= 8; // 等同于: a = a | 8
std::cout << "a after bitwise OR: " << a << std::endl;
a ^= 6; // 等同于: a = a ^ 6
std::cout << "a after bitwise XOR: " << a << std::endl;
a <<= 1; // 等同于: a = a << 1
std::cout << "a after left shift: " << a << std::endl;
a >>= 2; // 等同于: a = a >> 2
std::cout << "a after right shift: " << a << std::endl;
return 0;
}
代码挑战
写一个名为
countSetBits
的函数,接受一个无符号整数作为输入,并返回其二进制表示中设置位(1
)的数量。
Loading...
> 此处输出代码运行结果