» C++快速入门 » 1. 基础篇 » 1.2 基础类型

基础类型

C++中的基本类型如下:

整数类型

  • int:整数类型。
  • short:短整数类型。
  • long:长整数类型。
  • long long:长长整数类型。
  • 上述类型的 signedunsigned 版本。

浮点类型

  • float:单精度浮点类型。
  • double:双精度浮点类型。
  • long double:扩展精度浮点类型。

字符类型

  • char:字符类型。
  • signed char and unsigned 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 可以表示较小整数类型(如 charshort)的所有值,则在执行操作之前将较小的类型提升转换为 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...
> 此处输出代码运行结果
上页
下页