C++ 变量类型

C++ 中,,变量是用来存储数据的容器。不同的数据需要不同的存储空间,因此C++提供了多种数据类型来表示不同的数据。选择合适的数据类型是编写高质量C++代码的基础。了解不同的数据类型及其特点,可以帮助我们更好地理解程序的运行机制,提高代码的效率和可读性。本文主要介绍C++ 中,定义声明变量、声明多个变量、变量名及命名规则,以及相关的示例代码。

1、变量类型

变量其实通过一个标记调用内存中的值,而变量名就是这个标记的名称,但是万一这个标记已经被提前占用或者解释器认为这个标记是不合法的,那么就会报错。

在C++中,有不同类型的变量,例如:

类型

描述

bool

存储值 true 或 false。

char

通常是一个字符(八位)。

这是一个整数类型。

int

对机器而言,整数的最自然的大小。

float

单精度浮点值。单精度是这样的格式,

1位符号,8位指数,23位小数。

double

双精度浮点值。双精度是1位符号,

11位指数,52位小数。

void

表示类型的缺失。

wchar_t

宽字符类型。

 1)整型(Integer Types)

int:存储整数,通常占用 4 个字节(32 位),范围约为 -2,147,483,648 到 2,147,483,647。

short:比 int 更小,通常占用 2 个字节(16 位),范围约为 -32,768 到 32,767。

long:比 int 更大,通常占用 4 或 8 个字节,取决于编译器和系统。

long long:更大的整数类型,至少占 8 个字节,适合存储非常大的整数。

无符号整数类型:unsigned 类型可以存储非负整数,如 unsigned intunsigned short,其范围是相应类型的非负数范围。

#include <iostream>

int main() {
    int age = 25; // 常规整型
    short smallNumber = 32000; // 短整型
    long largeNumber = 1000000; // 长整型
    long long veryLargeNumber = 123456789012345LL; // 超长整型

    unsigned int positiveNumber = 300U; // 无符号整型

    std::cout << "int: " << age << "\n";
    std::cout << "short: " << smallNumber << "\n";
    std::cout << "long: " << largeNumber << "\n";
    std::cout << "long long: " << veryLargeNumber << "\n";
    std::cout << "unsigned int: " << positiveNumber << "\n";

    return 0;
}

2)浮点型(Floating Point Types)

float:单精度浮点数,通常占用 4 个字节,有约 6-7 位有效数字。

double:双精度浮点数,通常占用 8 个字节,有约 15 位有效数字。

long double:扩展精度浮点数,通常占用 10、12 或 16 个字节,具体取决于编译器。

#include <iostream>

int main() {
    float pi = 3.14159F; // 单精度浮点数
    double e = 2.718281828459045; // 双精度浮点数
    long double goldenRatio = 1.618033988749895L; // 扩展精度浮点数

    std::cout << "float: " << pi << "\n";
    std::cout << "double: " << e << "\n";
    std::cout << "long double: " << goldenRatio << "\n";

    return 0;
}

3)字符型(Character Types)

char:用于存储单个字符,通常占用 1 个字节(8 位),存储范围为 -128 到 127 或 0 到 255(具体取决于是否为无符号类型)。

unsigned char:无符号字符类型,范围为 0 到 255。

wchar_t:宽字符类型,用于存储 Unicode 字符,大小取决于系统,通常是 2 或 4 字节。

#include <iostream>

int main() {
    char letter = 'A'; // 字符型
    unsigned char unsignedLetter = 65; // 无符号字符型
    wchar_t wideChar = L'中'; // 宽字符类型

    std::cout << "char: " << letter << "\n";
    std::cout << "unsigned char: " << unsignedLetter << "\n";
    std::wcout << L"wchar_t: " << wideChar << L"\n";

    return 0;
}

4)布尔型(Boolean Type)

bool:布尔类型,存储 true 或 false,通常占用 1 个字节。

#include <iostream>

int main() {
    bool isHappy = true; // 布尔类型
    bool isSad = false;

    std::cout << "isHappy: " << isHappy << "\n";
    std::cout << "isSad: " << isSad << "\n";

    return 0;
}

5)空类型(Void Type)

void:表示无类型,一般用于函数返回类型表示不返回值,如 void myFunction();。

#include <iostream>

void sayHello() { // void 表示不返回任何值
    std::cout << "Hello, World!\n";
}

int main() {
    sayHello();
    return 0;
}

6)其他类型

auto:自动类型推导,编译器根据初始化的值推导出变量类型,如 auto x = 5.0; 会将 x 推导为 double 类型。

decltype:用于获取表达式的类型,如 decltype(a + b) 返回 a + b 的类型。

nullptr_t:表示空指针的类型,用于定义 nullptr 值。

#include <iostream>

int main() {
    auto number = 42; // 自动推导为 int 类型
    auto decimal = 3.14; // 自动推导为 double 类型

    decltype(number) anotherNumber = 100; // 使用 number 的类型,即 int
    decltype(decimal) anotherDecimal = 2.718; // 使用 decimal 的类型,即 double

    std::cout << "auto number: " << number << "\n";
    std::cout << "auto decimal: " << decimal << "\n";
    std::cout << "decltype anotherNumber: " << anotherNumber << "\n";
    std::cout << "decltype anotherDecimal: " << anotherDecimal << "\n";

    return 0;
}

7)自定义类型

结构体(struct)、联合体(union) 和 枚举(enum):用于创建复杂的数据结构和枚举类型。

类(class):面向对象编程的基础,用于创建对象和定义其属性和方法。

#include <iostream>

struct Person { // 结构体
    std::string name;
    int age;
};

union Data { // 联合体
    int integer;
    float decimal;
};

enum Color { // 枚举类型
    Red, Green, Blue
};

int main() {
    Person person = {"Alice", 30};
    Data data;
    data.integer = 42;

    Color favoriteColor = Green;

    std::cout << "Person name: " << person.name << ", age: " << person.age << "\n";
    std::cout << "Union integer: " << data.integer << "\n";
    std::cout << "Favorite color: " << favoriteColor << "\n";

    return 0;
}

2、定义声明变量

要创建变量,必须指定类型并为其分配值:

type variable = value;

在这里,type 必须是一个有效的 C 数据类型,可以是 charw_charintfloatdouble 或任何用户自定义的对象,也可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明:

#include <iostream>
using namespace std;
extern int a,b;
extern int c;
extern float f;
int main () {
   int a,b;
   int c = -1;
   float f;
   a = 10;
   b = 20;
   c = a + b;
   printf("value of c : %d \n",c);
   f = 70.0/3.0;
   printf("value of f : %f \n",f);
   return 0;
}

可以在不分配值的情况下声明变量,然后在以后分配值:

int    i, j, k;
char   c, ch;
float  f, money;
double d;

3、变量名及命名规则

变量名的开头不能是数字,可以由字母或下划线开头。但,实际上编程中最常用的是以字母开头,而以下划线开头的变量名是系统专用的。

随便打开一个头文件就会看到,它里面所有的变量名、宏名、函数名全是以下划线开始的。

所以为了避免与系统定义的名字产生冲突,在编程的时候,除非要求这么定义,否则永远都不要使用下划线作为一个变量名的开头。

变量名以字母 A-Za-z 或下划线 _ 开头,后跟零个或多个字母、下划线和数字(0-9)。

变量名内不允许出现标点字符,比如 @$%。C 是区分大小写的编程语言。例如,Cjavapycjavapy 是两个不同的标识符。

4、局部变量

局部变量是定义在函数体内部的变量,作用域仅限于函数体内部。离开函数体就会无效。再调用就是出错。

例如,

#include <iostream>
using namespace std;
int main(){
    int n = 30;  //局部变量
    //代码块由{}包围
    {
        int n = 40;  //局部变量
        printf("block n: %d\n", n);
    }
    printf("main n: %d\n", n);
    return 0;
}

5、全局变量

全局变量是定义在所有的函数外部定义的变量,它的作用域是整个程序,也就是所有的源文件。

#include <iostream>
using namespace std;
int n = 10;  //全局变量
void func1(){
    int n = 20;  //局部变量
    printf("func1 n: %d\n", n);
}
void func2(int n){
    printf("func2 n: %d\n", n);
}
void func3(){
    printf("func3 n: %d\n", n);
}
int main(){
    int n = 30;  //局部变量
    func1();
    func2(n);
    func3();
    //代码块由{}包围
    {
        int n = 40;  //局部变量
        printf("block n: %d\n", n);
    }
    printf("main n: %d\n", n);
    return 0;
}

推荐阅读
cjavapy编程之路首页