开头介绍下C++语言先,C++是一种广泛使用的计算机程序设计语言,起源于20世纪80年代,由比雅尼·斯特劳斯特鲁普在贝尔实验室开发。它是C语言的扩展,增加了面向对象编程的特性。C++的应用场景广泛,包括系统软件、游戏开发、嵌入式系统、高性能计算、网络编程和图形界面应用程序等。其语言特点主要体现在高效性、可移植性、面向对象编程、模板编程以及丰富的标准库,与C语言相比,C++继承了C语言的优点并进行了扩充和完善,C++属于C语言的超集,加入了更多的编程范式和表达能力,但两者也存在一定的差异。
Hello World
这里先上一个最基础的编译和运行案例,在终端输出"Hello World",具体代码如下:
#include <iostream>
int main() {
std::cout << "Hello, World!" << std::endl;
return 0;
}
-
- 导入标准输入输出流库
#include <iostream>
这一行是预处理指令,告诉编译器导入包含标准输入输出流库(iostream)。这个库可以使用输入输出功能,打印文本到屏幕。
- 导入标准输入输出流库
-
- 定义主函数
int main()
这是主函数的开始,C++程序从这里开始执行。int 表示这个函数返回一个整数值,这是与操作系统的约定。在{}
大括号内是主函数的体,也就是程序执行的所有指令的地方。
- 定义主函数
-
- 输出"Hello World"
std::cout << "Hello, World!" << std::endl;
std::cout
是C++中用于输出的对象。std
是标准库的命名空间,cout
代表控制台输出。
<<
是插入操作符,用于将右侧的内容发送到左侧指定的流中。
std::endl
是一个特殊的标记,表示新行的开始,并且会刷新输出缓冲区,确保立即显示输出。
- 输出"Hello World"
-
- 结束主函数
return 0;
return
语句用于结束函数的执行,并将控制权返回给调用函数。在main
函数中,返回值通常提供给操作系统用于指示程序的退出状态。0
表示成功。
- 结束主函数
运行程序
编译C++文件与编译C语言文件在使用的编译器上有所不同。C语言通常使用的是gcc编译器,而C++则使用的是g++编译器。尽管两者在编译器上有所区别,但编译的大致操作流程是相近的。
要编译一个C++文件,比如名为hello.cpp
的文件,可以使用以下命令:
g++ hello.cpp -o hello
这条命令会调用g++编译器来编译hello.cpp
文件,并将编译后生成的可执行文件命名为hello
。其中,-o
选项用于指定输出文件的名称。
编译完成后,可以使用以下命令来运行这个程序:
./hello
这条命令会在当前目录下执行名为hello
的可执行文件。如果代码编写正确正常,即可在终端看到程序输出的结果。
常用操作符表格
先附上常用操作符表格,方便以后使用查找:
类别 | 操作符 | 描述 | 使用实例 |
---|---|---|---|
算术操作符 | + | 加法 | int a = 5, b = 2; int result = a + b; |
算术操作符 | - | 减法 | int a = 5, b = 2; int result = a - b; |
算术操作符 | * | 乘法 | int a = 5, b = 2; int result = a * b; |
算术操作符 | / | 除法 | int a = 5, b = 2; int result = a / b; |
算术操作符 | % | 取模(求余数) | int a = 5, b = 2; int result = a % b; |
算术操作符 | ++ | 自增 | int a = 5; a++; |
算术操作符 | -- | 自减 | int a = 5; a--; |
比较操作符 | == | 等于 | int a = 5, b = 2; bool result = a == b; |
比较操作符 | != | 不等于 | int a = 5, b = 2; bool result = a != b; |
比较操作符 | > | 大于 | int a = 5, b = 2; bool result = a > b; |
比较操作符 | < | 小于 | int a = 5, b = 2; bool result = a < b; |
比较操作符 | >= | 大于或等于 | int a = 5, b = 2; bool result = a >= b; |
比较操作符 | <= | 小于或等于 | int a = 5, b = 2; bool result = a <= b; |
逻辑操作符 | ! | 逻辑非 | bool a = true; bool result = !a; |
逻辑操作符 | && | 逻辑与 | bool a = true, b = false; bool result = a && b; |
逻辑操作符 | || | 逻辑或 | bool a = true, b = false; bool result = a || b; |
位操作符 | & | 按位与 | int a = 5, b = 3; int result = a & b; |
位操作符 | | | 按位或 | int a = 5, b = 3; int result = a | b; |
位操作符 | ^ | 按位异或 | int a = 5, b = 3; int result = a ^ b; |
位操作符 | ~ | 按位取反 | int a = 5; int result = ~a; |
位操作符 | << | 左移 | int a = 5; int result = a << 1; |
位操作符 | >> | 右移 | int a = 5; int result = a >> 1; |
赋值操作符 | = | 赋值 | int a; a = 5; |
赋值操作符 | += | 加等于 | int a = 5; a += 2; |
赋值操作符 | -= | 减等于 | int a = 5; a -= 2; |
赋值操作符 | *= | 乘等于 | int a = 5; a *= 2; |
赋值操作符 | /= | 除等于 | int a = 5; a /= 2; |
赋值操作符 | %= | 模等于 | int a = 5; a %= 2; |
赋值操作符 | <<= | 左移等于 | int a = 5; a <<= 1; |
赋值操作符 | >>= | 右移等于 | int a = 5; a >>= 1; |
赋值操作符 | &= | 按位与等于 | int a = 5; a &= 3; |
赋值操作符 | ^= | 按位异或等于 | int a = 5; a ^= 3; |
赋值操作符 | |= | 按位或等于 | int a = 5; a |= 3; |
条件操作符 | ? : | 条件表达式 | int a = 5, b = 2; int result = a > b ? a : b; |
类型操作符 | sizeof | 返回变量或类型所占的字节数 | int a; size_t size = sizeof(a); |
类型操作符 | typeid | 返回一个表达式的类型信息 | int a; const std::type_info& typeInfo = typeid(a); |
类型操作符 | const_cast 、dynamic_cast 、reinterpret_cast 、static_cast | C++的类型转换操作符 | double d = 3.14; int i = static_cast<int>(d); |
其他操作符 | & | 取地址操作符 | int a = 5; int* ptr = &a; |
其他操作符 | * | 解引用操作符 | int a = 5; int* ptr = &a; int value = *ptr; |
其他操作符 | . | 成员访问操作符 | struct S { int x; }; S s; int value = s.x; |
其他操作符 | -> | 指针成员访问操作符 | struct S { int x; }; S* s = new S; int value = s->x; |
其他操作符 | [] | 下标操作符 | int arr[5]; int value = arr[2]; |
其他操作符 | () | 函数调用操作符 | void func() { } func(); |
其他操作符 | , | 逗号操作符 | int a = 1, b = 2; |
其他操作符 | new 和 delete | 动态内存分配和释放 | int* ptr = new int; *ptr = 5; delete ptr; |
常用操作符使用示例
赋值操作符
对变量进行赋值
// assignment_operators.cpp
#include <iostream>
#include <bitset>
using namespace std;
int main() {
int a = 5;
int b = 10;
// 赋值
a = b;
cout << "a = b; a = " << a << endl;
// 加等于
a += 3;
cout << "a += 3; a = " << a << endl;
// 减等于
a -= 2;
cout << "a -= 2; a = " << a << endl;
// 乘等于
a *= 2;
cout << "a *= 2; a = " << a << endl;
// 除等于
a /= 5;
cout << "a /= 5; a = " << a << endl;
// 模等于
a %= 3;
cout << "a %= 3; a = " << a << endl;
// 重新设置下a和b的值
a = 5; // 101
b = 3; // 0011
// 左移等于
a <<= 1;
cout << "a <<= 1; a = " << bitset<4>(a) << " (Binary) or " << a << " (Decimal)" << endl;
// 右移等于
a >>= 1;
cout << "a >>= 1; a = " << bitset<4>(a) << " (Binary) or " << a << " (Decimal)" << endl;
// 按位与等于
a &= b;
cout << "a &= b; a = " << bitset<4>(a) << " (Binary) or " << a << " (Decimal)" << endl;
// 按位异或等于
a ^= b;
cout << "a ^= b; a = " << bitset<4>(a) << " (Binary) or " << a << " (Decimal)" << endl;
// 按位或等于
a |= b;
cout << "a |= b; a = " << bitset<4>(a) << " (Binary) or " << a << " (Decimal)" << endl;
return 0;
}
运算结果:
类型操作符
查看或转换变量的数据类型
// type_operators.cpp
#include <iostream>
#include <typeinfo>
int main() {
int intVar = 10;
std::cout << "int的大小: " << sizeof(int) << " bytes" << std::endl;
std::cout << "TintVar的类型: " << typeid(intVar).name() << std::endl;
double* doublePtr = new double(3.14);
std::cout << "指针的大小: " << sizeof(doublePtr) << " bytes" << std::endl;
std::cout << "指针的类型: " << typeid(doublePtr).name() << std::endl;
// 类型转换
int i = 42;
float f = static_cast<float>(i); // static_cast转换
const int constInt = 100;
int* p = const_cast<int*>(&constInt); // const_cast去除常量性
int intValue = 1234;
int* intPtr = &intValue;
char* charPtr = reinterpret_cast<char*>(intPtr); // reinterpret_cast重新解释类型
// 清理动态分配的内存
delete doublePtr;
return 0;
}
逻辑操作符
对变量进行与
或
非
等逻辑操作
#include <iostream>
using namespace std;
int main() {
bool a = true;
bool b = false;
// 逻辑非
bool not_a = !a;
cout << "!a = " << not_a << endl;
// 逻辑与
bool and_result = a && b;
cout << "a && b = " << and_result << endl;
// 逻辑或
bool or_result = a || b;
cout << "a || b = " << or_result << endl;
return 0;
}
三目运算符
使用?:符号进行条件运算,例如int max = (a > b) ? a : b;
判断a
和b
的大小,将较大的值赋给max
。
#include <iostream>
int main() {
int x = 5;
int y = 10;
// 条件 ? 表达式1 : 表达式2
int max = (x > y) ? x : y;
std::cout << "最大值是: " << max << std::endl;
return 0;
}
比较运算符
用于比较变量之间的大小、是否相等
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 5;
// 等于
if (a == b) {
cout << "a等于b" << endl;
} else {
cout << "a不等于b" << endl;
}
// 不等于
if (a != b) {
cout << "a不等于b" << endl;
}
// 大于
if (a > b) {
cout << "a大于b" << endl;
}
// 小于
if (b < a) {
cout << "a小于b" << endl;
}
// 大于或等于
if (a >= b) {
cout << "a大于等于b" << endl;
}
// 小于或等于
if (b <= a) {
cout << "b小于等于a" << endl;
}
return 0;
}
算术操作符
对变量进行数学运算
#include <iostream>
using namespace std;
int main() {
int a = 10;
int b = 3;
// 加法
int sum = a + b;
cout << "a + b = " << sum << endl;
// 减法
int difference = a - b;
cout << "a - b = " << difference << endl;
// 乘法
int product = a * b;
cout << "a * b = " << product << endl;
// 除法
if (b != 0) {
double quotient = static_cast<double>(a) / b;
cout << "a / b = " << quotient << endl;
}
// 取模
int remainder = a % b;
cout << "a % b = " << remainder << endl;
// 自增
a++;
cout << "a after a++ = " << a << endl;
// 自减
b--;
cout << "b after b-- = " << b << endl;
return 0;
}
位运算符
对变量进行位操作,是对整数在内存中的二进制位进行操作的一种运算方式。
#include <iostream>
#include <bitset>
using namespace std;
int main() {
unsigned int a = 15; // Binary: 1111
unsigned int b = 9; // Binary: 1001
std::cout << "a = " << bitset<4>(a) << ", b = " << bitset<4>(b) << std::endl;
// 按位与
unsigned int and_result = a & b;
cout << "a & b = " << bitset<4>(and_result) << endl;
// 按位或
unsigned int or_result = a | b;
cout << "a | b = " << bitset<4>(or_result) << endl;
// 按位异或
unsigned int xor_result = a ^ b;
cout << "a ^ b = " << bitset<4>(xor_result) << endl;
// 按位取反
unsigned int not_a = ~a;
cout << "~a = " << bitset<32>(not_a) << endl; // Assuming a 32-bit unsigned int
// 左移
unsigned int left_shift = a << 2;
cout << "a << 2 = " << bitset<8>(left_shift) << endl;
// 右移
unsigned int right_shift = a >> 1;
cout << "a >> 1 = " << bitset<4>(right_shift) << endl;
return 0;
}
其他操作符
包括逗号操作符,、成员访问操作符.
和->
、作用域解析操作符::
、指针相关操作符*
和&(取地址)
、以及sizeof
操作符等
#include <iostream>
void printHello() // 函数声明 printHello(),函数用来打印"Hello, GGBond"
{
std::cout << "Hello, GGBond" << std::endl;
}
int main() {
int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr; // 隐式使用&操作符,arr是第一个元素的地址
std::cout << "arr[0]的地址: " << &arr[0] << std::endl;
std::cout << "[0]的值: " << *ptr << std::endl; // 使用*操作符解引用
// 使用 . 和 -> 操作符访问成员
struct ExampleStruct {
int x;
};
ExampleStruct obj;
obj.x = 10;
ExampleStruct* pObj = &obj;
std::cout << "obj.x: " << obj.x << std::endl;
std::cout << "pObj->x: " << pObj->x << std::endl;
// 使用下标操作符 []
std::cout << "arr[2]: " << arr[2] << std::endl;
// 调用函数
printHello();
// 使用逗号操作符
int a = 1, b = 2, c;
c = (a += 2, b += 3, a + b);
std::cout << "c: " << c << std::endl; // 逗号操作符返回最后一个表达式的值,所以c的值是8
// 使用 new 和 delete 操作符
int* dynamicInt = new int(5);
std::cout << "动态整数的值: " << *dynamicInt << std::endl;
delete dynamicInt;
return 0;
}