自学内容网 自学内容网

2.C++的变量,输入,输出

C++的变量,输入,输出

同其它编程语言一样,C++程序要想与用户进行交互,必须有输出,输入,还有存储数据的变量。接下来我们一起来看看在C++中如何进行输入输出,以及变量的存储吧。

输出

在编程业界有个不成文的规定,就是学习一门编程语言,第一个写出来的程序必须得是输出“Hello World”这句话,同时这句话也预示着接下来的学习会一帆风顺,那么我们也来一起写我们的第一个C++程序来输出这句话吧。

#include <iostream>

using namespace std;

int main(){
    cout << "Hello world" << endl;
    return 0;
}

如果有过C语言的基础,那么这段代码你一定能看懂个八九不离十,没有也没关系,接下来我会逐行解释这段代码。

#include <iostream>
  • 这是一个预处理指令,它告诉编译器在编译这个 C++ 程序时包含标准输入输出流的头文件 <iostream>。这个头文件中包含了输入输出相关的类和对象,如 coutcin,用于进行标准的输入和输出操作。我们写程序一般都会包含这个头文件,在C语言中包含输入输出标准的头文件叫<stdio.h>
using namespace std;
  • 这行代码使用了 std 命名空间。std 是 C++ 标准库中使用的命名空间,其中包含了许多标准的类、函数和对象。使用 using namespace std; 可以让我们在代码中直接使用 std 命名空间中的元素,而不需要每次都加上 std:: 前缀,如我们在下面使用coutendl以及后面输入会用到的cin都不用写成std::cout类似的写法。但在大型项目中,为了避免命名冲突,一般不推荐使用这种方式,而是使用 std:: 前缀。
int main(){
  • 这是 C++ 程序的入口点。main 函数是每个 C++ 程序都必须有的函数,程序从这里开始执行。int 表示这个函数返回一个整数类型的值。在这里强调一点,我们使用的vs2022或者是clion这种IDE,创建一个项目里面只允许有一个main函数,也就是说无论有多少个.cpp源文件,这些文件里面只能有一个main函数,因为main函数是一个项目的入口点,程序执行是从main函数开始执行,如果有多个main函数则会报错,这点和python等编程语言不同。如果是使用Dev-Cpp这类可以单文件编译运行的IDE则不存在这个问题。那么我们如果想在一个项目里面运行不一样的程序,我们可以把前一个main函数命名为main1函数,后面main2main3以此类推,想运行哪个文件就把哪个文件里面包含main函数,但是在编译时所有的源文件都会进行编译,所以其它源文件中有错误,同样会导致编译失败。
    cout << "Hello world" << endl;
  • coutstd 命名空间中的输出流对象,用于输出数据。<< 是输出运算符,它将后面的数据发送到 cout 中。"Hello world" 是一个字符串常量,将被输出。endl 是一个操纵符,用于插入一个换行符并刷新输出缓冲区,使得输出的内容立即显示在屏幕上。
    return 0;
}
  • 这行代码表示 main 函数的结束,并返回一个整数 0。在 C++ 中,返回 0 通常表示程序正常结束。根据约定,程序成功执行并正常结束时返回 0,而其他非零值可以表示程序出现错误或异常情况。

那么这就是我们C++中的输出,下面我们来一起看看变量。

变量

变量,在有的教材中也叫字面量,是差不多的意思,就是使用一个名字来"存储"一个数据,这里的存储打个引号,因为实际上它只是指向内存中存储数据,并不是真正意义上的存储。

一、变量的定义

在 C++ 中,变量是用于存储数据的容器,它们在程序执行期间可以保存不同类型的值。变量在使用前必须先声明,声明变量的基本格式如下:

<数据类型> <变量名>;

例如:

int age;

这里声明了一个名为 age 的变量,其数据类型为 int(整数)。

二、变量的数据类型

C++ 有多种数据类型,以下是一些常见的数据类型:

1. 基本数据类型
  • 整数类型

    • int:通常用于存储普通的整数,其大小一般为 4 个字节,范围通常为 -21474836482147483647
    • short:短整型,通常占用 2 个字节,范围相对较小。
    • long:长整型,一般为 4 或 8 个字节,范围比 int 可能更大。
    • long long:长长整型,通常为 8 个字节,可存储更大范围的整数。
    • unsigned 修饰符:可以加在整数类型前面,用于存储无符号整数,即只存储非负整数,范围从 0 开始,例如 unsigned int
  • 浮点类型

    • float:单精度浮点数,通常占用 4 个字节,用于存储带有小数部分的数字,但精度相对较低。
    • double:双精度浮点数,一般占用 8 个字节,精度比 float 高。
    • long double:更高精度的浮点数,占用空间更大,具体大小可能因编译器而异。
  • 字符类型

    • char:用于存储单个字符,通常占用 1 个字节,存储字符的 ASCII 码值。例如:
    char grade = 'A';
    
    • wchar_t:宽字符类型,用于存储宽字符,通常用于存储 Unicode 字符,占用 2 或 4 个字节。
  • 布尔类型

    • bool:用于存储布尔值,只能取 truefalse 两个值。例如:
    bool isTrue = true;
    
三、变量的初始化

变量可以在声明时初始化,也可以在声明后进行初始化。

  • 声明时初始化:

    int count = 0;
    

    这里count变量在声明时被初始化为 0

  • 声明后初始化:

    int score;
    score = 95;
    

    先声明score变量,然后将其值初始化为 95

四、变量的作用域

变量的作用域是指变量在程序中可见和可访问的范围。

1. 局部变量

在函数或代码块(如 iffor 等)内部声明的变量是局部变量,它们只能在该函数或代码块内使用。例如:

void exampleFunction() {
    int localVar = 10;  // 局部变量
    // 这里可以使用 localVar
}
// 这里不能使用 localVar
2. 全局变量

在所有函数和代码块之外声明的变量是全局变量,它们可以在整个程序中被访问(从声明位置开始)。例如:

int globalVar = 20;  // 全局变量

void anotherFunction() {
    // 这里可以使用 globalVar
}
五、变量的命名规则
  • 变量名可以由字母、数字和下划线组成。
  • 变量名必须以字母或下划线开头,不能以数字开头。
  • C++ 是区分大小写的,所以 ageAge 是不同的变量。
  • 变量名不能是 C++ 的关键字,例如 intiffor 等不能作为变量名。
六、变量的存储类别
  • 自动存储类别(auto):

    • 这是默认的存储类别,局部变量通常是自动存储类别,它们在函数或代码块开始时创建,在结束时销毁。
    auto int temp = 5;  // auto 关键字在 C++11 之后可用于自动类型推断,这里可直接写 int temp = 5;
    
  • 静态存储类别(static):

    • static 关键字声明的变量在程序的整个生命周期内存在,并且只会初始化一次。
    static int staticVar = 1;
    
    • 静态局部变量在函数调用结束后不会销毁,下次调用函数时,其值仍然保留。
七、常量

常量是在程序运行期间其值不会改变的量。

  • 使用 const 关键字:

    const int MAX_VALUE = 100;
    

    这里MAX_VALUE的值在程序运行期间不能被修改。

八、引用

引用是 C++ 的一个重要特性,它为已存在的变量提供了一个别名。

  • 声明引用:

    int num = 5;
    int& ref = num;  // ref 是 num 的引用
    

    ref的操作等同于对num的操作,例如:

    ref = 10;  // 此时 num 的值也会变为 10
    
九、指针

指针是存储变量地址的变量。

  • 声明指针:

    int value = 25;
    int* ptr = &value;  // ptr 是指向 value 的指针
    

    这里&value表示value的地址,*ptr可以访问value的值,例如:

    std::cout << *ptr << std::endl;  // 输出 25
    

变量是 C++ 编程的基础,合理使用不同类型的变量可以让程序更高效、更准确地处理各种数据。通过选择合适的数据类型、正确的作用域和存储类别,可以更好地管理程序中的数据存储和操作。同时,常量、引用和指针等概念扩展了变量的使用方式,为更复杂的编程任务提供了便利。

输入

下面我们一起来看看一个程序,用来输入两个整数并输出它们的和。

#include <iostream>

using namespace std;

int main() {
    int num1, num2;  // 声明两个整数变量

    // 从标准输入读取两个整数
    cout << "请输入第一个整数: ";
    cin >> num1;
    cout << "请输入第二个整数: ";
    cin >> num2;

    // 计算两个整数的和
    int sum = num1 + num2;

    // 输出结果
    cout << "两个整数的和是: " << sum << endl;

    return 0;
}
代码解释:
  1. 头文件包含

    #include <iostream>
    

    包含 iostream 头文件,它是 C++ 中用于输入输出操作的标准头文件。

  2. 使用命名空间

    using namespace std;
    

    使用 using namespace std; 语句,这样可以直接使用 std 命名空间中的元素,而不需要在每个元素前加上 std:: 前缀。这样做在简单程序中可能比较方便,但在大型项目中可能会引起命名冲突,因为 std 命名空间包含了很多标准库中的元素,不同的库可能会有相同的名称。

  3. 变量声明

    int num1, num2;
    

    声明两个整数变量 num1num2,它们将用于存储用户输入的整数。

  4. 输入操作

    cout << "请输入第一个整数: ";
    cin >> num1;
    cout << "请输入第二个整数: ";
    cin >> num2;
    
    • coutstd::cout 的简写,用于输出提示信息。
    • cinstd::cin 的简写,用于从标准输入读取用户输入的整数。
  5. 求和操作

    int sum = num1 + num2;
    

    计算 num1num2 的和,并将结果存储在 sum 变量中。

  6. 输出结果

    cout << "两个整数的和是: " << sum << endl;
    

    使用 cout 输出求和结果,endlstd::endl 的简写,用于输出换行符,确保输出的内容换行显示。

拓展:关于C++中的格式化输出

众所周知,C++是向下兼容C语言的,那也就意味着C语言的代码可以在C++里面运行,如果习惯了使用C风格的输入和输出,可以在头文件中包括这个头文件,这样在代码中就可以使用scanfprintf这类函数了。如果之前没有接触过C语言也没关系,C++也提供了格式化输出的方法。

一、基本的格式化输出

在 C++ 中,最常用的格式化输出是通过 std::cout<< 操作符进行的。可以直接输出各种类型的数据,如整数、浮点数、字符串等。

#include <iostream>

int main() {
    int num = 10;
    double pi = 3.14159;
    std::string str = "Hello, World!";

    std::cout << "Integer: " << num << std::endl;
    std::cout << "Float: " << pi << std::endl;
    std::cout << "String: " << str << std::endl;
    return 0;
}
二、使用 iomanip 头文件进行更复杂的格式化

<iomanip> 头文件提供了一些操纵符,可以实现更精确的格式化输出,包括设置输出宽度、精度、填充字符等。

1. 控制输出宽度

使用 std::setw() 操纵符可以设置输出字段的宽度。

#include <iostream>
#include <iomanip>

int main() {
    int num = 123;
    std::cout << std::setw(10) << num << std::endl;
    return 0;
}

在这个例子中,std::setw(10) 会将输出的 num 的宽度设置为 10 个字符,如果 num 的长度小于 10,则在左边填充空格。

2. 控制填充字符

使用 std::setfill() 操纵符可以设置填充字符。

#include <iostream>
#include <iomanip>

int main() {
    int num = 123;
    std::cout << std::setfill('*') << std::setw(10) << num << std::endl;
    return 0;
}

这里使用 std::setfill('*') 将填充字符设置为 *,所以输出会是 *******123

3. 控制浮点数精度

对于浮点数,可以使用 std::setprecision() 操纵符来控制精度。

#include <iostream>
#include <iomanip>

int main() {
    double pi = 3.141592653589793;
    std::cout << std::setprecision(4) << pi << std::endl;
    return 0;
}

std::setprecision(4) 将浮点数 pi 的精度设置为 4 位,输出结果会是 3.142

4. 控制输出格式(定点或科学计数法)

使用 std::fixedstd::scientific 操纵符可以控制浮点数的输出格式。

#include <iostream>
#include <iomanip>

int main() {
    double num = 1234567.89;
    std::cout << std::fixed << std::setprecision(2) << num << std::endl;
    std::cout << std::scientific << std::setprecision(2) << num << std::endl;
    return 0;
}
  • std::fixed 会将浮点数以定点形式输出,输出结果是 1234567.89
  • std::scientific 会将浮点数以科学计数法形式输出,输出结果是 1.23e+06
5. 显示正负号

使用 std::showpos 操纵符可以显示正数的正号。

#include <iostream>
#include <iomanip>

int main() {
    int num1 = 123;
    int num2 = -456;
    std::cout << std::showpos << num1 << " " << num2 << std::endl;
    return 0;
}

输出结果会是 +123 -456

6. 左对齐和右对齐

使用 std::leftstd::right 操纵符可以控制输出的对齐方式。

#include <iostream>
#include <iomanip>

int main() {
    int num = 123;
    std::cout << std::left << std::setw(10) << num << std::endl;
    std::cout << std::right << std::setw(10) << num << std::endl;
    return 0;
}
  • std::left 会将输出左对齐,结果为 123
  • std::right 会将输出右对齐,结果为 123
三、使用 printf 函数进行格式化输出(C 风格)

C++ 也可以使用 C 语言的 printf 函数进行格式化输出,该函数定义在 <cstdio> 头文件中。

#include <cstdio>

int main() {
    int num = 123;
    double pi = 3.14159;
    printf("Integer: %d\n", num);
    printf("Float: %.2f\n", pi);
    return 0;
}
  • %d 用于输出整数。
  • %.2f 用于输出浮点数并保留两位小数。
四、自定义输出格式

对于更复杂的自定义输出格式,可以重载 operator<< 操作符或者使用类的成员函数。

#include <iostream>
#include <string>

class Person {
public:
    std::string name;
    int age;
    Person(std::string n, int a) : name(n), age(a) {}
    friend std::ostream& operator<<(std::ostream& os, const Person& p) {
        os << "Name: " << p.name << ", Age: " << p.age;
        return os;
    }
};

int main() {
    Person person("Alice", 25);
    std::cout << person << std::endl;
    return 0;
}

在这个例子中,通过重载 operator<< 操作符,使得 Person 类的对象可以直接使用 cout 输出,输出结果为 Name: Alice, Age: 25

C++ 的格式化输出提供了丰富的方式来控制输出的外观和精度,你可以根据具体需求选择合适的方法。对于简单的程序,使用 std::cout 和基本的操纵符通常足够。对于需要更精确的格式化,可以使用 iomanip 中的操纵符,或者使用 C 风格的 printf 函数。而对于自定义类型,可以通过重载 operator<< 操作符来实现更灵活的输出方式。

拓展2:C++中的格式化输入

一、基本的格式化输入

在 C++ 中,最常用的格式化输入是通过 std::cin>> 操作符来完成的。它可以根据变量的类型自动解析输入的数据。

#include <iostream>

int main() {
    int num;
    double value;
    std::string str;

    std::cout << "请输入一个整数: ";
    std::cin >> num;
    std::cout << "你输入的整数是: " << num << std::endl;

    std::cout << "请输入一个浮点数: ";
    std::cin >> value;
    std::cout << "你输入的浮点数是: " << value << std::endl;

    std::cout << "请输入一个字符串: ";
    std::cin >> str;
    std::cout << "你输入的字符串是: " << str << std::endl;

    return 0;
}
二、使用 std::getline 输入字符串

如果需要输入包含空格的整行字符串,可以使用 std::getline 函数,它可以读取一行直到遇到换行符。

#include <iostream>
#include <string>

int main() {
    std::string line;
    std::cout << "请输入一行字符串: ";
    std::getline(std::cin, line);
    std::cout << "你输入的字符串是: " << line << std::endl;
    return 0;
}
三、使用 std::stringstream 进行复杂的字符串解析

std::stringstream 可以将字符串当作输入流进行解析,方便对字符串进行复杂的格式化操作。

#include <iostream>
#include <sstream>
#include <string>

int main() {
    std::string input = "123 3.14 Hello";
    std::stringstream ss(input);
    int num;
    double value;
    std::string str;

    ss >> num >> value >> str;
    std::cout << "解析出的整数: " << num << std::endl;
    std::cout << "解析出的浮点数: " << value << std::endl;
    std::cout << "解析出的字符串: " << str << std::endl;

    return 0;
}
四、使用 sscanf 进行 C 风格的格式化输入(C++ 兼容)

C++ 中也可以使用 C 语言的 sscanf 函数,该函数定义在 <cstdio> 头文件中。

#include <cstdio>
#include <iostream>
#include <string>

int main() {
    char buffer[100] = "456 2.71 World";
    int num;
    double value;
    char str[50];

    sscanf(buffer, "%d %lf %s", &num, &value, str);
    std::cout << "解析出的整数: " << num << std::endl;
    std::cout << "解析出的浮点数: " << value << std::endl;
    std::cout << "解析出的字符串: " << str << std::endl;

    return 0;
}
五、格式化输入的一些注意事项和技巧
1. 处理输入错误

当输入的数据类型与期望的不符时,std::cin 会进入错误状态,可以使用 std::cin.clear() 清除错误状态,使用 std::cin.ignore() 跳过错误输入。

#include <iostream>

int main() {
    int num;
    std::cout << "请输入一个整数: ";
    while (!(std::cin >> num)) {
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cout << "输入错误,请重新输入一个整数: ";
    }
    std::cout << "你输入的整数是: " << num << std::endl;
    return 0;
}
2. 输入多个数据

可以使用 std::cin 连续输入多个数据,但要注意输入的数据之间需要用空格、制表符或换行符分隔。

#include <iostream>

int main() {
    int a, b;
    std::cout << "请输入两个整数: ";
    std::cin >> a >> b;
    std::cout << "你输入的整数是: " << a << " 和 " << b << std::endl;
    return 0;
}
3. 混合输入数字和字符

当混合输入数字和字符时,需要注意 std::cin 的输入缓冲机制,因为 std::cin 会在遇到空格或换行符时停止读取。

#include <iostream>

int main() {
    int num;
    char ch;
    std::cout << "请输入一个整数和一个字符: ";
    std::cin >> num >> ch;
    std::cout << "你输入的整数是: " << num << ",字符是: " << ch << std::endl;
    return 0;
}
六、使用 std::cin 的格式化输入标志

std::cin 可以使用一些标志来控制输入的行为,例如 std::skipws 可以跳过输入流中的空格。

#include <iostream>

int main() {
    char ch;
    std::cin >> std::skipws >> ch;
    std::cout << "你输入的字符是: " << ch << std::endl;
    return 0;
}

C++ 的格式化输入可以通过多种方式实现,对于简单的输入需求,std::cin>> 操作符是最常用的。对于更复杂的输入,如处理整行输入、解析复杂的字符串,可以使用 std::getlinestd::stringstream。如果需要使用 C 风格的输入,可以使用 sscanf。同时,要注意处理输入错误和输入数据之间的分隔符,以确保输入操作的正确性。

总结:
  • std::cin>> 操作符:根据变量类型自动解析输入,适用于基本的数据类型输入。
  • std::getline:读取一行字符串,可处理包含空格的字符串。
  • std::stringstream:将字符串作为输入流,可对字符串进行复杂的解析。
  • sscanf:C 风格的格式化输入,功能强大但使用较复杂。
  • 输入错误处理:使用 std::cin.clear()std::cin.ignore() 处理输入错误。

原文地址:https://blog.csdn.net/m0_60046831/article/details/145228880

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!