QT第五六七节课笔记 - 用C语言快速入门

2.2 从C语言快速入门

2.2.1 输入输出

C++ 中的输入和输出(I/O)主要是通过标准库中的输入输出流来实现的。最常用的是 iostream 库,它提供了用于输入和输出的基本流类,包括 cincoutcerrclog

标准输出流 (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;
}

2.2.2 基本变量类型

C++ 基本数据类型整理成表格。以下是一个表格,展示了不同的基本数据类型及其一般用途和大小范围:

和C语言类似。

数据类型描述大小(通常情况下)用途
int整型至少 16 位存储整数
short int短整型至少 16 位存储较小的整数
long int长整型至少 32 位存储较大的整数
long long int更长的整型至少 64 位存储非常大的整数
unsigned int无符号整型int存储非负整数
float单精度浮点类型32 位存储小数,精度约为 6-7 位小数
double双精度浮点类型64 位存储小数,精度约为 15-16 位小数
long double扩展精度浮点类型80 位或更多存储小数,提供比 double 更高的精度
char字符型8 位存储单个字符或小整数
unsigned char无符号字符型8 位存储较大的字符或作为字节使用
signed char有符号字符型8 位明确作为带符号的字符或小整数使用
bool布尔型通常为 8 位存储真值 true 或假值 false C语言C99以上支持
wchar_t宽字符类型通过为16位或32位存储中文或者unicode

宽字符的用法

#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_MAXint 类型的最大值。
  • INT_MINint 类型的最小值。
  • UINT_MAXunsigned int 类型的最大值。
  • LONG_MAXlong int 类型的最大值。
  • LONG_MINlong int 类型的最小值。
  • LLONG_MAXlong long int 类型的最大值。
  • LLONG_MINlong long int 类型的最小值。

示例代码

下面是一个简单的示例,展示了如何使用 <climits> 中的值:

#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;
}

这个程序会输出 intunsigned intlong long int 类型的最大值和最小值。

注意事项

  • <climits> 提供的是编译时确定的常量,这意味着这些值在编译时就已经固定,根据编译器和平台的不同而可能有所不同。
  • 使用这些限制值可以帮助你编写更可移植和安全的代码,特别是在处理可能超出数据类型范围的操作时。

2.2.3 流程控制

在 C++ 中,流程控制语句用于根据不同条件控制程序的执行流程。它们是编程中的基本构建块,允许程序根据条件执行不同的代码段,重复执行某些操作,或者根据特定情况跳过某些代码段。下面是 C++ 中最常见的流程控制语句:

条件语句

  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 时执行的代码
}

循环语句

for 循环:当知道循环应该执行的次数时使用。

for (initialization; condition; increment) {
    // 循环体
}

while 循环:当条件为真时,重复执行代码块。

while (condition) {
    // 循环体
}

do-while 循环:至少执行一次循环体,然后再检查条件。

do {
    // 循环体
} while (condition);

跳转语句

  1. break 语句:用于立即跳出最近的 switch 或循环(forwhiledo-while)。
  2. continue 语句:跳过循环的当前迭代,并继续下一次迭代。
  3. goto 语句:直接跳转到程序中的另一个点。使用 goto 通常不推荐,因为它可以使代码难以阅读和维护。

流程控制语句是编程中非常重要的部分,允许开发者编写可以根据不同情况改变行为的灵活且强大的程序。在使用这些语句时,应该确保逻辑清晰,以便代码易于理解和维护。

2.2.4 函数

在 C++ 中,函数是一段执行特定任务的代码块,它可以带有参数,并且可能返回一个值。函数的使用使得代码更加模块化和可重用,有助于降低代码的复杂性,并提高可维护性。

函数的基本结构

C++ 函数的基本结构包括返回类型、函数名、参数列表和函数体:

返回类型 函数名(参数列表) {
    // 函数体
    // 返回语句(如果有返回值的话)
}

示例

以下是一个 C++ 函数的简单示例:

#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;
}

在这个示例中,add 函数接收两个整数参数,并返回它们的和。

函数的组成部分

  1. 返回类型:指定函数返回的数据类型。如果函数不返回任何值,则使用 void
  2. 函数名:函数的标识符,用于调用函数。
  3. 参数列表:括号内的变量列表,用于从函数的调用者那里接收值。如果函数不接收任何参数,则此列表为空。
  4. 函数体:大括号 {} 内的一系列语句,定义了函数的执行操作。

2.2.5 内联函数

内联函数(Inline Function)是C++中一种特殊的函数,其定义直接在每个调用点展开。这意味着编译器会尝试将函数调用替换为函数本身的代码,这样可以减少函数调用的开销,尤其是在小型函数中。

特点

  1. 减少函数调用开销:内联函数通常用于优化小型、频繁调用的函数,因为它避免了函数调用的常规开销(如参数传递、栈操作等)。
  2. 编译器决策:即使函数被声明为内联,编译器也可能决定不进行内联,特别是对于复杂或递归函数。
  3. 适用于小型函数:通常只有简单的、执行时间短的函数适合做内联。
  4. 定义在每个使用点:内联函数的定义(而非仅仅是声明)必须对每个使用它的文件都可见,通常意味着将内联函数定义在头文件中。

使用方法

通过在函数声明前添加关键字 inline 来指示编译器该函数适合内联:

inline int max(int x, int y) {
    
    return x > y ? x : y;
}

示例

#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;
}

在这个示例中,函数 add 被定义为内联函数。当它被调用时,编译器可能会将函数调用替换为函数体内的代码。

注意事项

  • 过度使用的风险:不应滥用内联函数,因为这可能会增加最终程序的大小(代码膨胀)。对于大型函数或递归函数,内联可能导致性能下降。
  • 编译器的决定:最终是否将函数内联是由编译器决定的,即使函数被标记为 inline
  • 适用场景:最适合内联的是小型函数和在性能要求高的代码中频繁调用的函数。

内联函数是一种用于优化程序性能的工具,但需要合理使用,以确保代码的可维护性和性能的平衡。

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

上官可编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值