一、输入输出
C++ 中的输入和输出(I/O)主要是通过标准库中的输入输出流来实现的。最常用的是 iostream 库,它提供了用于输入和输出的基本流类,包括 cin 、cout 、cerr 和 clog。
标准输出流 (cout)
•cout 代表标准输出流,通常用于向屏幕输出数据。
•使用操作符 <<(插入操作符)向 cout 发送数据。
•例如,std::cout << "Hello, world!" << std::endl; 会在屏幕上打印 “Hello, world!” 并换行。
标准输入流 ( cin )
•cin 代表标准输入流,用于从键盘接收数据。
•使用操作符 >>(提取操作符)从 cin 提取数据。
•例如,int x; std::cin >> x; 会从用户那里读取一个整数并存储在变量 x 中。
标准错误流 (cerr) 和标准日志流 (clog)
•cerr 用于输出错误消息。与 cout 不同,cerr 不是缓冲的,这意味着它会立即输出。
•clog 类似于 cerr,但它是缓冲的。它通常用于记录错误和日志信息。
示例代码
下面是一个展示如何使用这些基本流的简单示例:
#include <iostream>
int main() {
// 使用 cout 输出
std::cout << "Enter a number: ";
// 使用 cin 输入
int num;
std::cin >> num;
// 输出结果
std::cout << "You entered: " << num << std::endl;
std::clog << "Logging: user entered a number." << std::endl;
return 0;
}
二、基本变量类型
宽字符的用法
#include <iostream>
#include <locale>
#include <wchar.h>
int main() {
// 设置本地化以支持宽字符
std::setlocale(LC_ALL, "");
// 使用 wchar_t 类型定义一个宽字符串
wchar_t wstr[] = L"你好,世界!";
// 在 C++ 中打印宽字符串
std::wcout << wstr << std::endl;
return 0;
}
在 C++ 中,<climits>
(或在 C 中是 <limits.h>
)是一个标准头文件,提供了关于整型限制的信息。这个头文件中定义了各种整型数据类型的属性,如最大值、最小值等。使用这些信息可以帮助你了解在特定编译器和平台上各种数据类型的大小和范围。
如何使用 <climits>
要使用 <climits>
中定义的常量,你首先需要包含这个头文件:
#include <climits>
然后,你可以使用它提供的各种常量,例如:
•INT_MAX:int 类型的最大值。
•INT_MIN:int 类型的最小值。
•UINT_MAX:unsigned int 类型的最大值。
•LONG_MAX:long int 类型的最大值。
•LONG_MIN:long int 类型的最小值。
•LLONG_MAX:long long int 类型的最大值。
•LLONG_MIN:long long int 类型的最小值。
示例代码
#include <iostream>
#include <climits>
int main() {
std::cout << "The range of int is from " << INT_MIN << " to " << INT_MAX << std::endl;
std::cout << "The maximum value of unsigned int is " << UINT_MAX << std::endl;
std::cout << "The range of long long is from " << LLONG_MIN << " to " << LLONG_MAX << std::endl;
return 0;
}
注意事项
<climits>
提供的是编译时确定的常量,这意味着这些值在编译时就已经固定,根据编译器和平台的不同而可能有所不同。- 使用这些限制值可以帮助你编写更可移植和安全的代码,特别是在处理可能超出数据类型范围的操作时。
三、流程控制
1.条件语句
•if
语句:基于条件的基本控制结构。如果条件为真,则执行代码块。
if (condition) {
// 条件为真时执行的代码
}
•else
语句:与 if
语句配合使用,当 if
的条件为假时执行。
if (condition) {
// 条件为真时执行的代码
} else {
// 条件为假时执行的代码
}
•else if
语句:用于测试多个条件。
if (condition1) {
// 第一个条件为真时执行的代码
} else if (condition2) {
// 第二个条件为真时执行的代码
} else {
// 所有条件为假时执行的代码
}
•switch
语句:基于变量的值选择执行不同代码块的方法。
switch (expression) {
case value1:
// expression 等于 value1 时执行的代码
break;
case value2:
// expression 等于 value2 时执行的代码
break;
default:
// 没有匹配的 case 时执行的代码
}
2.循环语句
•for 循环:当知道循环应该执行的次数时使用。
for (initialization; condition; increment) {
// 循环体
}
•while
循环:当条件为真时,重复执行代码块。 •do-while
循环:至少执行一次循环体,然后再检查条件。
do {
// 循环体
} while (condition);
3.跳转语句
•break
语句:用于立即跳出最近的 switch
或循环(for
、while
、do-while
)。
•continue
语句:跳过循环的当前迭代,并继续下一次迭代。
•goto
语句:直接跳转到程序中的另一个点。使用 goto
通常不推荐,因为它可以使代码难以阅读和维护。
四、函数
在 C++ 中,函数是一段执行特定任务的代码块,它可以带有参数,并且可能返回一个值。函数的使用使得代码更加模块化和可重用,有助于降低代码的复杂性,并提高可维护性。
函数的基本结构
C++ 函数的基本结构包括返回类型、函数名、参数列表和函数体:
返回类型 函数名(参数列表) {
// 函数体
// 返回语句(如果有返回值的话)
}
示例代码
在这个示例中,add
函数接收两个整数参数,并返回它们的和。
#include <iostream>
using namespace std;
// 函数声明
int add(int x, int y);
int main() {
int result = add(5, 3);
cout << "Result: " << result << endl;
return 0;
}
// 函数定义
int add(int x, int y) {
return x + y;
}
五、内联函数
内联函数(Inline Function)是C++中一种特殊的函数,其定义直接在每个调用点展开。这意味着编译器会尝试将函数调用替换为函数本身的代码,这样可以减少函数调用的开销,尤其是在小型函数中。
1.特点
1.减少函数调用开销:内联函数通常用于优化小型、频繁调用的函数,因为它避免了函数调用的常规开销(如参数传递、栈操作等)。
2.编译器决策:即使函数被声明为内联,编译器也可能决定不进行内联,特别是对于复杂或递归函数。
3.适用于小型函数:通常只有简单的、执行时间短的函数适合做内联。
4.定义在每个使用点:内联函数的定义(而非仅仅是声明)必须对每个使用它的文件都可见,通常意味着将内联函数定义在头文件中。
2.使用方法
通过在函数声明前添加关键字 inline
来指示编译器该函数适合内联:
inline int max(int x, int y) {
return x > y ? x : y;
}
示例代码
在这个示例中,函数 add
被定义为内联函数。当它被调用时,编译器可能会将函数调用替换为函数体内的代码。
#include <iostream>
inline int add(int a, int b) {
return a + b;
}
int main() {
int result = add(5, 3); // 编译器可能会将此替换为:int result = 5 + 3;
std::cout << "Result: " << result << std::endl;
return 0;
}
3.注意事项
- 过度使用的风险:不应滥用内联函数,因为这可能会增加最终程序的大小(代码膨胀)。对于大型函数或递归函数,内联可能导致性能下降。
- 编译器的决定:最终是否将函数内联是由编译器决定的,即使函数被标记为
inline
。 - 适用场景:最适合内联的是小型函数和在性能要求高的代码中频繁调用的函数。
内联函数是一种用于优化程序性能的工具,但需要合理使用,以确保代码的可维护性和性能的平衡。