C++的变量,输入,输出
同其它编程语言一样,C++程序要想与用户进行交互,必须有输出,输入,还有存储数据的变量。接下来我们一起来看看在C++中如何进行输入输出,以及变量的存储吧。
输出
在编程业界有个不成文的规定,就是学习一门编程语言,第一个写出来的程序必须得是输出“Hello World”
这句话,同时这句话也预示着接下来的学习会一帆风顺,那么我们也来一起写我们的第一个C++程序来输出这句话吧。
#include <iostream>using namespace std;int main(){cout << "Hello world" << endl;return 0;
}
如果有过C语言的基础,那么这段代码你一定能看懂个八九不离十,没有也没关系,接下来我会逐行解释这段代码。
#include <iostream>
- 这是一个预处理指令,它告诉编译器在编译这个 C++ 程序时包含标准输入输出流的头文件
<iostream>
。这个头文件中包含了输入输出相关的类和对象,如cout
和cin
,用于进行标准的输入和输出操作。我们写程序一般都会包含这个头文件,在C语言中包含输入输出标准的头文件叫<stdio.h>
。
using namespace std;
- 这行代码使用了
std
命名空间。std
是 C++ 标准库中使用的命名空间,其中包含了许多标准的类、函数和对象。使用using namespace std;
可以让我们在代码中直接使用std
命名空间中的元素,而不需要每次都加上std::
前缀,如我们在下面使用cout
,endl
以及后面输入会用到的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
函数,后面main2
,main3
以此类推,想运行哪个文件就把哪个文件里面包含main
函数,但是在编译时所有的源文件都会进行编译,所以其它源文件中有错误,同样会导致编译失败。
cout << "Hello world" << endl;
cout
是std
命名空间中的输出流对象,用于输出数据。<<
是输出运算符,它将后面的数据发送到cout
中。"Hello world"
是一个字符串常量,将被输出。endl
是一个操纵符,用于插入一个换行符并刷新输出缓冲区,使得输出的内容立即显示在屏幕上。
return 0;
}
- 这行代码表示
main
函数的结束,并返回一个整数 0。在 C++ 中,返回 0 通常表示程序正常结束。根据约定,程序成功执行并正常结束时返回 0,而其他非零值可以表示程序出现错误或异常情况。
那么这就是我们C++中的输出,下面我们来一起看看变量。
变量
变量,在有的教材中也叫字面量,是差不多的意思,就是使用一个名字来"存储"一个数据,这里的存储打个引号,因为实际上它只是指向内存中存储数据,并不是真正意义上的存储。
一、变量的定义
在 C++ 中,变量是用于存储数据的容器,它们在程序执行期间可以保存不同类型的值。变量在使用前必须先声明,声明变量的基本格式如下:
<数据类型> <变量名>;
例如:
int age;
这里声明了一个名为 age
的变量,其数据类型为 int
(整数)。
二、变量的数据类型
C++ 有多种数据类型,以下是一些常见的数据类型:
1. 基本数据类型
-
整数类型:
int
:通常用于存储普通的整数,其大小一般为 4 个字节,范围通常为-2147483648
到2147483647
。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
:用于存储布尔值,只能取true
或false
两个值。例如:
bool isTrue = true;
三、变量的初始化
变量可以在声明时初始化,也可以在声明后进行初始化。
-
声明时初始化:
int count = 0;
这里
count
变量在声明时被初始化为0
。 -
声明后初始化:
int score; score = 95;
先声明
score
变量,然后将其值初始化为95
。
四、变量的作用域
变量的作用域是指变量在程序中可见和可访问的范围。
1. 局部变量
在函数或代码块(如 if
、for
等)内部声明的变量是局部变量,它们只能在该函数或代码块内使用。例如:
void exampleFunction() {int localVar = 10; // 局部变量// 这里可以使用 localVar
}
// 这里不能使用 localVar
2. 全局变量
在所有函数和代码块之外声明的变量是全局变量,它们可以在整个程序中被访问(从声明位置开始)。例如:
int globalVar = 20; // 全局变量void anotherFunction() {// 这里可以使用 globalVar
}
五、变量的命名规则
- 变量名可以由字母、数字和下划线组成。
- 变量名必须以字母或下划线开头,不能以数字开头。
- C++ 是区分大小写的,所以
age
和Age
是不同的变量。 - 变量名不能是 C++ 的关键字,例如
int
、if
、for
等不能作为变量名。
六、变量的存储类别
-
自动存储类别(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;
}
代码解释:
-
头文件包含:
#include <iostream>
包含
iostream
头文件,它是 C++ 中用于输入输出操作的标准头文件。 -
使用命名空间:
using namespace std;
使用
using namespace std;
语句,这样可以直接使用std
命名空间中的元素,而不需要在每个元素前加上std::
前缀。这样做在简单程序中可能比较方便,但在大型项目中可能会引起命名冲突,因为std
命名空间包含了很多标准库中的元素,不同的库可能会有相同的名称。 -
变量声明:
int num1, num2;
声明两个整数变量
num1
和num2
,它们将用于存储用户输入的整数。 -
输入操作:
cout << "请输入第一个整数: "; cin >> num1; cout << "请输入第二个整数: "; cin >> num2;
cout
是std::cout
的简写,用于输出提示信息。cin
是std::cin
的简写,用于从标准输入读取用户输入的整数。
-
求和操作:
int sum = num1 + num2;
计算
num1
和num2
的和,并将结果存储在sum
变量中。 -
输出结果:
cout << "两个整数的和是: " << sum << endl;
使用
cout
输出求和结果,endl
是std::endl
的简写,用于输出换行符,确保输出的内容换行显示。
拓展:关于C++中的格式化输出
众所周知,C++是向下兼容C语言的,那也就意味着C语言的代码可以在C++里面运行,如果习惯了使用C风格的输入和输出,可以在头文件中包括这个头文件,这样在代码中就可以使用scanf
,printf
这类函数了。如果之前没有接触过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::fixed
和 std::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::left
和 std::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::getline
和 std::stringstream
。如果需要使用 C 风格的输入,可以使用 sscanf
。同时,要注意处理输入错误和输入数据之间的分隔符,以确保输入操作的正确性。
总结:
std::cin
和>>
操作符:根据变量类型自动解析输入,适用于基本的数据类型输入。std::getline
:读取一行字符串,可处理包含空格的字符串。std::stringstream
:将字符串作为输入流,可对字符串进行复杂的解析。sscanf
:C 风格的格式化输入,功能强大但使用较复杂。- 输入错误处理:使用
std::cin.clear()
和std::cin.ignore()
处理输入错误。