【C++】语法-数据类型,变量类型
菜鸟教程:https://www.runoob.com/cplusplus/cpp-basic-syntax.html
1、C++的7种基本数据类型

2、C++的类型修饰符(可以使用1个或多个进行修饰)
- signed
- unsigned
- short
- long
3、C++的数据类型占用的内存空间
一字节为 8 位

4、typedef 声明
您可以使用 typedef 为一个已有的类型取一个新的名字。下面是使用 typedef 定义一个新类型的语法:
typedef type newname;
例如,下面的语句会告诉编译器,feet 是 int 的另一个名称:
typedef int feet;
现在,下面的声明是完全合法的,它创建了一个整型变量 distance:
feet distance;
5、枚举类型
枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
如果一个变量只有几种可能的值,可以定义为枚举(enumeration)类型。所谓"枚举"是指将变量的值一一列举出来,变量的值只能在列举出来的值的范围内。
创建枚举,需要使用关键字 enum。枚举类型的一般形式为:
enum 枚举名{ 标识符[=整型常数], 标识符[=整型常数], ... 标识符[=整型常数] } 枚举变量;
如果枚举没有初始化, 即省掉"=整型常数"时, 则从第一个标识符开始。
例如,下面的代码定义了一个颜色枚举,变量 c 的类型为 color。最后,c 被赋值为 "blue"。
enum color { red, green, blue } c; c = blue;
默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。但是,您也可以给名称赋予一个特殊的值,只需要添加一个初始值即可。例如,在下面的枚举中,green 的值为 5。
enum color { red, green=5, blue };
在这里,blue 的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1,但 red 的值依然为 0。
6、数据类型转换
类型转换是将一个数据类型的值转换为另一种数据类型的值。
C++ 中有四种类型转换:静态转换、动态转换、常量转换和重新解释转换。
静态转换(Static Cast)
静态转换是将一种数据类型的值强制转换为另一种数据类型的值。
静态转换通常用于比较类型相似的对象之间的转换,例如将 int 类型转换为 float 类型。
静态转换不进行任何运行时类型检查,因此可能会导致运行时错误。
int i = 10; float f = static_cast<float>(i); // 静态将int类型转换为float类型
动态转换(Dynamic Cast)
动态转换通常用于将一个基类指针或引用转换为派生类指针或引用。动态转换在运行时进行类型检查,如果不能进行转换则返回空指针或引发异常。
class Base {}; class Derived : public Base {}; Base* ptr_base = new Derived; Derived* ptr_derived = dynamic_cast<Derived*>(ptr_base); // 将基类指针转换为派生类指针
常量转换(Const Cast)
常量转换用于将 const 类型的对象转换为非 const 类型的对象。
常量转换只能用于转换掉 const 属性,不能改变对象的类型。
const int i = 10; int& r = const_cast<int&>(i); // 常量转换,将const int转换为int
重新解释转换(Reinterpret Cast)
重新解释转换将一个数据类型的值重新解释为另一个数据类型的值,通常用于在不同的数据类型之间进行转换。
重新解释转换不进行任何类型检查,因此可能会导致未定义的行为。
int i = 10; float f = reinterpret_cast<float&>(i); // 重新解释将int类型转换为float类型
7、C++ 变量类型
变量其实只不过是程序可操作的存储区的名称。
在 C++ 中,有多种变量类型可用于存储不同种类的数据。
C++ 中每个变量都有指定的类型,类型决定了变量存储的大小和布局,该范围内的值都可以存储在内存中,运算符可应用于变量上。
变量的名称可以由字母、数字和下划线字符组成。它必须以字母或下划线开头。
大写字母和小写字母是不同的,因为 C++ 是大小写敏感的。
基于前一章讲解的基本类型,有以下几种基本的变量类型,将在下一章中进行讲解:

C++ 也允许定义各种其他类型的变量,比如枚举、指针、数组、引用、数据结构、类等等,这将会在后续的章节中进行讲解。
-
整数类型(Integer Types):
int:用于表示整数,通常占用4个字节。short:用于表示短整数,通常占用2个字节。long:用于表示长整数,通常占用4个字节。long long:用于表示更长的整数,通常占用8个字节。
-
浮点类型(Floating-Point Types):
float:用于表示单精度浮点数,通常占用4个字节。double:用于表示双精度浮点数,通常占用8个字节。long double:用于表示更高精度的浮点数,占用字节数可以根据实现而变化。
-
字符类型(Character Types):
char:用于表示字符,通常占用1个字节。wchar_t:用于表示宽字符,通常占用2或4个字节。char16_t:用于表示16位Unicode字符,占用2个字节。char32_t:用于表示32位Unicode字符,占用4个字节。
-
布尔类型(Boolean Type):
bool:用于表示布尔值,只能取true或false。
-
枚举类型(Enumeration Types):
enum:用于定义一组命名的整数常量。
-
指针类型(Pointer Types):
type*:用于表示指向类型为type的对象的指针。
-
数组类型(Array Types):
type[]或type[size]:用于表示具有相同类型的元素组成的数组。
-
结构体类型(Structure Types):
struct:用于定义包含多个不同类型成员的结构。
-
类类型(Class Types):
class:用于定义具有属性和方法的自定义类型。
-
共用体类型(Union Types):
union:用于定义一种特殊的数据类型,它可以在相同的内存位置存储不同的数据类型。
7、C++ 中的变量定义

变量定义指定一个数据类型,并包含了该类型的一个或多个变量的列表,如下所示:
type variable_list;
在这里,type 必须是一个有效的 C++ 数据类型,可以是 char、wchar_t、int、float、double、bool 或任何用户自定义的对象,variable_list 可以由一个或多个标识符名称组成,多个标识符之间用逗号分隔。下面列出几个有效的声明:
//只声明变量,但不进行初始化 int i, j, k; char c, ch; float f, salary; double d; //变量的声明和赋值 extern int d = 3, f = 5; // d 和 f 的声明 int d = 3, f = 5; // 定义并初始化 d 和 f byte z = 22; // 定义并初始化 z char x = 'x'; // 变量 x 的值为 'x'
8、C++ 中的变量声明
变量声明向编译器保证变量以给定的类型和名称存在,这样编译器在不需要知道变量完整细节的情况下也能继续进一步的编译。变量声明只在编译时有它的意义,在程序连接时编译器需要实际的变量声明。
当您使用多个文件且只在其中一个文件中定义变量时(定义变量的文件在程序连接时是可用的),变量声明就显得非常有用。您可以使用 extern 关键字在任何地方声明一个变量。虽然您可以在 C++ 程序中多次声明一个变量,但变量只能在某个文件、函数或代码块中被定义一次。
#include <iostream> using namespace std; // 变量声明 extern int a, b; extern int c; extern float f; int main () { // 变量定义 int a, b; int c; float f; // 实际初始化 a = 10; b = 20; c = a + b; cout << c << endl ; f = 70.0/3.0; cout << f << endl ; return 0; }
同样的,在函数声明时,提供一个函数名,而函数的实际定义则可以在任何地方进行。例如:
// 函数声明 int func(); int main() { // 函数调用 int i = func(); } // 函数定义 int func() { return 0; }
9、C++ 中的左值(Lvalues)和右值(Rvalues)
C++ 中有两种类型的表达式:
- 左值(lvalue):指向内存位置的表达式被称为左值(lvalue)表达式。左值可以出现在赋值号的左边或右边。
- 右值(rvalue):术语右值(rvalue)指的是存储在内存中某些地址的数值。右值是不能对其进行赋值的表达式,也就是说,右值可以出现在赋值号的右边,但不能出现在赋值号的左边。
变量是左值,因此可以出现在赋值号的左边。
数值型的字面值是右值,因此不能被赋值,不能出现在赋值号的左边。
下面是一个有效的语句:
// g是左值,20是右值 int g = 20; //不是有效语句,会生成编译时错误 10 = 20 ; //原因:10是一个右值,不能出现在赋值号(=)的左边
10、C++变量作用域
一般来说有三个地方可以定义变量:
-
在函数或一个代码块内部声明的变量,称为局部变量。
-
在函数参数的定义中声明的变量,称为形式参数。
-
在所有函数外部声明的变量,称为全局变量。
作用域是程序的一个区域,变量的作用域可以分为以下几种:
-
局部作用域:在函数内部声明的变量具有局部作用域,它们只能在函数内部访问。局部变量在函数每次被调用时被创建,在函数执行完后被销毁。
-
全局作用域:在所有函数和代码块之外声明的变量具有全局作用域,它们可以被程序中的任何函数访问。全局变量在程序开始时被创建,在程序结束时被销毁。
-
块作用域:在代码块内部声明的变量具有块作用域,它们只能在代码块内部访问。块作用域变量在代码块每次被执行时被创建,在代码块执行完后被销毁。
-
类作用域:在类内部声明的变量具有类作用域,它们可以被类的所有成员函数访问。类作用域变量的生命周期与类的生命周期相同。
注意:如果在内部作用域中声明的变量与外部作用域中的变量同名,则内部作用域中的变量将覆盖外部作用域中的变量。
10.1、局部变量
在函数或一个代码块内部声明的变量,称为局部变量。它们只能被函数内部或者代码块内部的语句使用。下面的实例使用了局部变量:
#include <iostream> using namespace std; int main () { // 局部变量声明 int a, b; int c; // 实际初始化 a = 10; b = 20; c = a + b; cout << c; return 0; }
10.2、全局变量
在所有函数外部定义的变量(通常是在程序的头部),称为全局变量。全局变量的值在程序的整个生命周期内都是有效的。
全局变量可以被任何函数访问。也就是说,全局变量一旦声明,在整个程序中都是可用的。下面的实例使用了全局变量和局部变量:
#include <iostream> using namespace std; // 全局变量声明 int g; int main () { // 局部变量声明 int a, b; // 实际初始化 a = 10; b = 20; g = a + b; cout << g; return 0; }
在程序中,局部变量和全局变量的名称可以相同,但是在函数内,局部变量的值会覆盖全局变量的值。下面是一个实例:
#include <iostream> using namespace std; int g=20; int syn(); int main(){ cout << "hello word sxf,sxq,chn" <<endl; int g=10; cout << "ju bu g="+std::to_string(g) <<endl; syn(); return 0; } int syn(){ cout << "quan ju g="+std::to_string(g) <<endl; return 0; } //运行结果 hello word sxf,sxq,chn ju bu g=10 quan ju g=20
初始化局部变量和全局变量
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:

块作用域指的是在代码块内部声明的变量:
#include <iostream> int main() { int a = 10; { int a = 20; // 块作用域变量 std::cout << "块变量: " << a << std::endl; } std::cout << "外部变量: " << a << std::endl; return 0; }
以上实例中,内部的代码块中声明了一个名为 a 的变量,它与外部作用域中的变量 a 同名。内部作用域中的变量 a 将覆盖外部作用域中的变量 a,在内部作用域中访问 a 时输出的是20,而在外部作用域中访问 a 时输出的是 10。
当上面的代码被编译和执行时,它会产生下列结果:
块变量: 20 外部变量: 10
10.3、类作用域
类作用域指的是在类内部声明的变量:
#include <iostream> class MyClass { public: static int class_var; // 类作用域变量 }; int MyClass::class_var = 30; int main() { std::cout << "类变量: " << MyClass::class_var << std::endl; return 0; }
以上实例中,MyClass 类中声明了一个名为 class_var 的类作用域变量。可以使用类名和作用域解析运算符 :: 来访问这个变量。在 main() 函数中访问 class_var 时输出的是 30。
类变量: 30
浙公网安备 33010602011771号