C++面向对象程序设计 - 标准输出流

news2024/11/17 10:56:04

        在C++中,标准输出流通常指的是与标准输出设备(通常是终端或控制台)相关联的流对象。这个流对象在C++标准库中被定义为std::cout、std::err、std::clog,它们是std::ostream类的一个实例。

一、cout,cerr和clog流

        ostream类定义了3个输出流对象,即cout,cerr,clog。

1.1cout流对象

        (1) cout是console output的缩写,意为控制台(终端显示器)的输出。它不是C++预定义的关键字,而是ostream流类的对象,在iostream中定义。顾名思义,流是流动的数据,cout流是流向输出(显示设备)的数据,cout流中的数据是用流插入运算符“<<“顺序加入的。

        示例如下:

cout <<"Hello World!" <<"I am learning C++.";

        cout流是容纳数据的载体,而并不是运算符。cout将它们输送到输出设备上显示,在显示设备上输出”Hello Wordl! I am learning C++.“。

        (2) 在使用"cout <<"输出基本类型的数据时,不必考虑数据是什么类型,系统会自动判断数据的类型,并根据类型选择调用与之匹配的运算符重载函数。示例如下:

cout <<10.0f <<100.58 <<'=' <<"operator"; 

        (3) cout流在内存中对应开辟了一个缓冲区,用来存储流中的数据,当向cout流插入一个endl时,不论缓冲区是否已满,都立即输出流中所有数据,然后插入一个换行符,并刷新流(清空缓冲区)。示例如下:

cout <<"Hello World" <<endl;
cout <<"I am learning C++" <<endl;

        注意的是如果插入换行符”\n“,则只是换行而已,并不是刷新cout流,与endl刷新流是清空缓冲区不是一回事。

        (4) 在iostream中只对”<<“和">>"运算符用于标准类型数据的输入输出进行了重载,但未对用户声明的类型数据的输入输出进行重载。所以用户可以声明新的类型,并用”<<“和">>"运算符对其进行输入输出另作重载。

1.2 cerr流对象

        cerr流对象是标准出错流,cerr流已被指定为与显示器关联,cerr作用是向标准出错设备(standard error device)输出有关的出错信息。cerr是console error的缩写,意为在控制台(显示器)显示出错的信息。

        注意的是cerr和cout的作用和用法虽然差不多,但是有一点不同的是,cout流通常是传送到显示设备输出,也可以被重定向输出到磁盘文件,而cerr流中的信息只能显示输出。

        通过解一元二次方程ax^{2}+bx+c=0,其一般解为x_{1,2}=\frac{-b\pm \sqrt{b^{2}-4ac}}{2a},但若a=0,或b^{2}-4ac<0时,用公式出错。编写程序,从键盘输入a、b、c的值,求x_{1}x_{2}。如果a=0或b^{2}-4ac<0,输出错误信息。代码示例如下:

#include <iostream>
#include <cmath>
using namespace std;

int main(){
	float a, b, c, disc;
	cout <<"Please enter the values of a, b, c:";
	cin >>a >>b >>c;
	// 如果a等于0输出错误信息
	if(a == 0){
		cerr <<"a is equal to zero, error!" <<endl;
	} else{
		// 如果b * b - 4 * a * c)结果小于0 ,输出错误信息
		if( (disc = b * b - 4 * a * c) < 0 ){
			cerr <<"Erro: dist=b*b-4*a*c<0" <<endl;
		} 
		// 满足条件,则正常输出结果
		else{
			cout <<"x1 = " <<(-b + sqrt(disc) / (2*a)) <<endl;
			cout <<"x2 = " <<(-b - sqrt(disc) / (2*a)) <<endl;
		}
	}
	return 0;
}

1)如输入a=0,运行后结果如下图:

2)如输入b^{2}-4ac<0,运行后结果如下图:

3)如满足条件,运行后结果如下图:

1.3 clog流对象

        clog流对象也是标准出错流,它是console log的缩写,作用与cerr相同,都是在终端显示器上显示出错信息。它们之间只是有微小区别。cerr是不经过缓冲区,直接向显示器上输出有关信息,而clog中的信息存放在缓冲区中,缓冲区满后或遇endl时向显示器输出。

        示例如下:

#include <iostream>
using namespace std;

int main(){
	clog <<"This is a message to the C library's error stream." <<endl;
	clog.flush();		//确保消息被立即刷新到设备
	return 0;
}

        运行结果如上图:

        实际编程中,cerr通常用于输出需要立即显示的错误消息或调试信息,而clog用于记录那些稍后再处理的更详细的日志信息。这只是常见的约定,并不是强制的。

二、格式输出

        在输出数据时,为简便起见,往往不指定输出的格式,由系统根据数据的类型采取默认的格式,但有时希望数据按指定的格式输出,如要求以十六进制或八进制形式输出一个整数,对输出的小数只保留两位小数等。

2.1 使用控制符控制输出格式

        以下为输出数据的控制符,如下表:

控制符作用
dec

设置整数的基数为10

hex设置整数的基数为16
oct设置整数的基数为8
setbae(n)设置整数的基数为n(n只能是8,10,16三者之一)
setfill(c)设置填充字符c,c可以是字符常量或字符变量
setprecision(n)设置实数的精度为n位,在以一般十进制小数形式输出时n代表有效数字。在以fixed(固定小数位数)形式和scientific(指数)形式输出时n为小数位数。
setw(n)设置字段宽度为n位
setiosflags(ios::fixed)设置浮点数以固定的小数位数显示
setiosflags(ios::scientific)设置浮点数以科技记数法(即指数形式)显示
setiosflags(ios::left)输出数据左对齐
setiosflags(ios::right)输出数据右对齐
setiosflags(ios::skipws)忽略前导的空格
setiosflags(ios::uppercase)在以科学记数法输出E和以十六进制输出字母X时以大写表示
setiosflags(ios::showpos)输出正数时给出”+“号
resetioflags()终止已设置的输出格式状态,在括号中应指定内容

        注意的是,这些控制符是在头文件iomanip中定义的,因而程序中应当包含头文件ipmanip。以下通过案例了解以上的方法,代码如下:

#include <iostream>
#include <iomanip>
using namespace std;

int main(){
	int a = 20;			//定义整数a值为20
	// 输出信息
	cout <<"Dec:" <<dec <<a <<endl;			//以十进制形式输出整数
	cout <<"Hex:" <<hex <<a <<endl;			//以十六进制形式输出整数a
	cout <<"Oct:" <<oct <<a <<endl;			//以八进制形式输出整数a
	
	cout <<endl;
	// 通过setbase输出
	cout <<"Use setbase to set the base:" <<endl;
	cout <<"Dec:" <<setbase(10) <<a <<endl;			//以十进制形式输出整数
	cout <<"Hex:" <<setbase(16) <<a <<endl;			//以十六进制形式输出整数a
	cout <<"Oct:" <<setbase(18) <<a <<endl;			//以八进制形式输出整数a
	
	cout <<endl;
	// 设置精度,宽度以及填充字符
	double PI = 3.1415926;
	cout <<"set precision 2: " <<setprecision(2) <<PI <<endl;		//改为2位小数
	cout <<setw(10) <<setprecision(2) <<PI <<endl;					//设置宽度为10
	cout <<setfill('*') <<setw(10) <<setprecision(2) <<PI <<endl;	//设置填充字符
	
	cout <<endl;
	// setiosfloags
	cout <<setiosflags(ios::scientific) <<setprecision(8);				// 按指数形式输出8位小数
	cout <<"PI = " <<PI <<endl;											// 指数形式输出PI值
	cout <<"precision 4 PI = " <<setprecision(4) <<PI <<endl;			// 指数形式 输出PI为4位小数
	
	cout <<"Left aligned, PI = " <<left <<setw(20) <<PI <<endl;			// 左侧齐
	cout <<"Right aligned, PI = " <<right <<setw(20) <<PI <<endl;		// 右对齐 
	
	// 使用大写字母
	cout <<"Uppercase: " <<uppercase <<hex <<255 <<endl;				//以16进制显示并使用大写字母
	cout <<"Show positive sign:" <<showpos <<PI <<endl;
	// 注意此时
	cout <<"Fixed, PI = " <<setiosflags(ios::fixed) <<PI <<endl;		// 改为小数形式输出
	return 0;
}

        运行结果如下图:

        最后代码试图将科学记数法设置为小数位,但是(cout <<"Fixed, PI = " <<setiosflags(ios::fixed) <<PI <<endl;)输出结果为+0XC.90FDA6896C25P-2,它可能是由于被setiosflags错误的解析导致的,通过resetiosflags重置清理掉前面的科学记数法格式即可。在上述代码后面追加以下代码即可:

// 重置指数形式
cout <<"reset ios flags:" <<endl;
cout <<resetiosflags(ios::scientific | ios::showpos);
cout <<"PI = " <<PI <<endl;

        resetiosflags中ios::scientific是清除科学记数法,ios::showpos是清除数值前面”+“号,输出结果如下图:

2.2 用流对象的成员函数控制输出格式

        除了可以用控制符来控制输出格式,还可以通过调用流对象cout中用于控制输出格式的成员函数来控制输出格式。用于控制输出格式的常用的成员函数如下表:

流成员函数与之作用相同的控制符作用
precision(n)setprecision(n)设置实数的精度为n位
width(n)setw(n)设置字段宽度为n位
fill(c)setfill(c)设置填充字符c
setf()setiosflags()设置输出格式状态,括号中应给出格式状态,内容与控制符setiosflags括号中的内容相同。
unsetf()resetiosflag()终止已设置的输出格式状态,在括号中应该指定内容

        格式标志在类ios中被定义为枚举值,因此在引用这些格式标志时要在前面加上类名ios和域运算符"::"。格式标志如下表:

格式标志作用
ios::left输出数据在本域范围内向左对齐
ios::right输出数据在本域范围内向右对齐
ios::internal数值的符号位在域宽度内左对齐,数值右对齐,中间由填充字符填充
ios::dec设置整数的基数为10
ios::oct设置整数的基数为8
ios::hex设置整数的基数为16
ios::showbase强制输出整数的基数(八进制数以0打头,十六进制数以0x打头)
ios::showpoint强制输出浮点数的小点和尾数0
ios::uppercase在以科学记数法格式E和以十六进制输出字母时以大写表示
ios::showpos对正数显示”+“号
ios::scientific浮点数以科学记数法格式输出
ios::fixed浮点数以定点格式(小数形式)输出
ios::unitbuf每次输出之后刷新所有的流
ios::stdio每次输出之后清除stdout, stderr

        下面使用流控制成员输出之前案例数据,代码如下:

#include <iostream>
#include <iomanip>
using namespace std;

int main(){
	int a = 20;			//定义整数a值为20
	// 输出信息
	cout.setf(ios::dec);				//设置以十进制形式输出整数
	cout <<"Dec:" <<a <<endl;
	cout.unsetf(ios::dec);			
	cout.setf(ios::hex);				//设置以十六进制形式输出整数a
	cout <<"Hex:" <<a <<endl;			
	cout.unsetf(ios::hex);
	cout.setf(ios::oct);				//设置以八进制形式输出整数a
	cout <<"Oct:" <<a <<endl;			
	cout.unsetf(ios::oct);
	
	cout <<endl;
	
	// 设置精度,宽度以及填充字符
	double PI = 3.1415926;
	cout <<"set precision 2, PI = " <<PI <<endl;			//显示PI值
	cout.width(30);											//设置宽度为30
	cout <<"set width, PI =" <<PI <<endl;	
	cout.width(30);											//设置宽度为30
	cout.fill('*');											// 置填充字符*
	cout <<"set fill, PI =" <<PI <<endl;
	
	cout <<endl;
	cout <<"set internal:" <<endl;
	cout.width(30);											//设置宽度为30
	cout.fill(' ');											// 置填充字符*
	cout.setf(ios::internal | ios::showpos);
	cout <<PI <<endl;
	cout.unsetf(ios::internal | ios::showpos);
	
	cout <<endl;
	// 标记为科学记数法
	cout.setf(ios::scientific);								// 设置为科学记数法
	cout <<"set scientific, PI = " <<PI <<endl;
	cout.precision(4);										//保留4位小数
	cout <<"precision 4, PI = " <<PI <<endl;
	
	cout <<endl;
	// 指定用定点形式输出
	cout.setf(ios::fixed);
	cout <<"Fixed, PI = " <<PI <<endl;
	cout.unsetf(ios::fixed);
	return 0;
}

        运行后结果如下图:

        这里同样,在最后输出时PI未得到想要结果,这是因为在设置科学记数法格式cout.setf(ios::scientific)未及时清除设置的格式标志导致的,所以添加cout.unsetf(ios::scientific)及时清除以避免影响后续输出。

        完整代码如下:

#include <iostream>
#include <iomanip>
using namespace std;

int main(){
	int a = 20;			//定义整数a值为20
	// 输出信息
	cout.setf(ios::dec);				//设置以十进制形式输出整数
	cout <<"Dec:" <<a <<endl;
	cout.unsetf(ios::dec);			
	cout.setf(ios::hex);				//设置以十六进制形式输出整数a
	cout <<"Hex:" <<a <<endl;			
	cout.unsetf(ios::hex);
	cout.setf(ios::oct);				//设置以八进制形式输出整数a
	cout <<"Oct:" <<a <<endl;			
	cout.unsetf(ios::oct);
	
	cout <<endl;
	
	// 设置精度,宽度以及填充字符
	double PI = 3.1415926;
	cout <<"set precision 2, PI = " <<PI <<endl;			//显示PI值
	cout.width(30);											//设置宽度为30
	cout <<"set width, PI =" <<PI <<endl;	
	cout.width(30);											//设置宽度为30
	cout.fill('*');											// 置填充字符*
	cout <<"set fill, PI =" <<PI <<endl;
	
	cout <<endl;
	cout <<"set internal:" <<endl;
	cout.width(30);											//设置宽度为30
	cout.fill(' ');											// 置填充字符*
	cout.setf(ios::internal | ios::showpos);
	cout <<PI <<endl;
	cout.unsetf(ios::internal | ios::showpos);
	
	cout <<endl;
	// 标记为科学记数法
	cout.setf(ios::scientific);								// 设置为科学记数法
	cout <<"set scientific, PI = " <<PI <<endl;
	cout.precision(4);										//保留4位小数
	cout <<"precision 4, PI = " <<PI <<endl;
	cout.unsetf(ios::scientific);
	
	cout <<endl;
	// 指定用定点形式输出
	cout.setf(ios::fixed);
	cout <<"Fixed, PI = " <<PI <<endl;
	cout.unsetf(ios::fixed);
	return 0;
}

        输出结果如下图:

三、用流成员函数put输出字符

        在程序中一般用cout和插入运算符”<<“实现输出,cout流在内存中有相应的缓冲区。有时有些特殊输出要求,ostream类还提供了专用于输出单个字符的成员函数put。

3.1 ASCII码输出

        如下示例代码:

#include <iostream>
using namespace std;

int main(){
	// ASCII字符码输出
	int arr[] = {71, 79, 79, 68};		// 字母GOOD分别对应ASCII码71,79,68
	// 循环输出单个字符
	for(int i = 0; i<4; i++) cout.put(arr[i]);
	cout.put('\n');
	return 0;
}

        运行结果如下图:

3.2 字符串反转

        也可使用cout.put()对字符串进行反转输出,示例代码如下:

#include <iostream>
#include <string>
using namespace std;

int main(){
	string message = "Hello World!";		//定义字符串信息
	const char *str = message.c_str();		//将字符串转换为char字符数组
	// 循环输出字符信息,倒序输出
	for(int i = message.length() - 1; i >= 0; i--) cout.put(*(str + i));
	// 换行
	cout.put('\n');
	return 0;
}

        运行后结果如下图:

        字符指针变量str指向第1个字符'H', a+1则是第2个字符'e'的地址,*(a+1)的值就是’e'。指针的相关知识前面已讲解过,想了解朋友可以翻看下,地址:C++面向对象程序设计 - 对象指针和this指针_面向对象版本的指针-CSDN博客

3.3 putchar函数

        除了可以用cout.put函数输出一个字符外,还可以用putchar函数输出一个字符。putchar函数是C语言中使用的,在stdio.h头文件中定义的。所以3.2中示例可以修改为putchar函数,代码如下:

#include <iostream>
#include <string>
using namespace std;

int main(){
	string message = "Hello World!";		//定义字符串信息
	const char *str = message.c_str();		//将字符串转换为char字符数组
	// 循环输出字符信息,倒序输出
	for(int i = message.length() - 1; i >= 0; i--) putchar(*(str + i));
	// 换行
	cout.put('\n');
	return 0;
}

        运行后输出结果与3.2相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1706853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VLDB ’25 最后 6 天截稿,58 个顶会信息纵览;ISPRS 城市分割数据集上线

「顶会」板块上线 hyper.ai 官网啦&#xff01;该板块为大家提供最新最全的 CCF A 类计算机顶会信息&#xff0c;包含会议简介、截稿倒计时、投稿链接等。 你是不是已经注册了顶会&#xff0c;但对截稿时间较为模糊&#xff0c;老是在临近 ddl 时才匆忙提交&#xff1b;又或者…

监控云安全的9个方法和措施

如今&#xff0c;很多企业致力于提高云计算安全指标的可见性&#xff0c;这是由于云计算的安全性与本地部署的安全性根本不同&#xff0c;并且随着企业将应用程序、服务和数据移动到新环境&#xff0c;需要不同的实践。检测云的云检测就显得极其重要。 如今&#xff0c;很多企业…

模拟量4~20mA电流传感器接线方式

一、模拟量4~20mA电流传感器接线方式 无源双线制是常见的电流型传感器接线方式&#xff0c;它具有简单、经济的特点。其接线方式如下&#xff1a; 传感器的“”接到数据采集器的电源“”上&#xff0c; 传感器的“-”端子连接到数据采集器的“AI”端子上&#xff0c; 数据采集器…

翻译《The Old New Thing》- What did MakeProcInstance do?

What did MakeProcInstance do? - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080207-00/?p23533 Raymond Chen 2008年02月07日 MakeProcInstance 做了什么&#xff1f; MakeProcInstance 宏实际上什么也不做。 #define MakeProcInst…

HackTheBox-Machines--Beep

Beep测试过程 1 信息收集 nmap端口扫描 gryphonwsdl ~ % nmap -sC -sV 10.129.137.179 Starting Nmap 7.94 ( https://nmap.org ) at 2024-05-28 14:39 CST Nmap scan report for 10.129.229.183 Host is up (0.28s latency). Not shown: 988 closed tcp ports (conn-refused…

python办公自动化——(二)替换PPT文档中图形数据-柱图

效果: 数据替换前 : 替换数据后: 实现代码 import collections.abc from pptx import Presentation from pptx.util import Cm,Pt import pyodbc import pandas as pd from pptx.chart.data import CategoryChartData…

C语言 数组—— 一维数组下标越界问题分析

目录 数组元素的访问 一维数组元素的越界访问 二维数组元素的越界访问 小结 数组元素的访问 访问数组元素时&#xff0c; 下标越界 是大忌&#xff01;  编译器通常不检查下标越界&#xff0c;导致程序运行时错误  下标越界&#xff0c;将访问数组以外的空间  …

如何学到数据库从入门到入土(MySQL篇)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

开源AI模型:未来发展的领航者!

开源AI模型简单概述 开源AI模型是指那些其源代码可以自由使用、修改和分发的人工智能模型。这些模型通常由社区成员共同开发&#xff0c;并且可以在遵守相应许可证的前提下被任何人用于商业或研究目的。开源AI模型的出现极大地推动了人工智能技术的发展&#xff0c;使得更多的…

uniapp - 文章模块页面

在上一篇文章中&#xff0c;创建了一个空白的文章模块页面。在这一篇文章&#xff0c;让我们来向页面中填充内容。 目录 页面效果涉及uniapp组件1.view2.swiper3.scroll-view4.属性解读1) class"style1 style2 .."2) circular单属性无赋值3) :autoplay"autoplay…

gitlab将本地文件项目上传至gitlab服务

打开gitlab网页界面&#xff0c;登陆管理员账号 &#xff08;测试服务器安装的gitlab&#xff0c;浏览器输入ip或配置的gitlab地址&#xff09; 创建新项目 使用gitlab创建项目 创建一个新项目&#xff08;忽略分组&#xff09; &#xff08;忽略分组&#xff09; 在创建工…

网络原理-------TCP协议

文章目录 TCP协议TCP协议段格式TCP原理确认应答机制 (安全机制)超时重传机制 (安全机制)连接管理机制 (安全机制)滑动窗口 (效率机制)流量控制 (安全机制)拥塞控制 (安全机制)延迟应答 (效率机制)捎带应答 (效率机制) 基于TCP的应用层协议 TCP协议 TCP, 即 Transmission Contr…

鸿蒙OS开发:【一次开发,多端部署】(导航栏) 导航栏

一多导航栏 介绍 本示例展示了导航组件在不同设备形态下的样式。 在sm设备上&#xff0c;以tabs形式展示&#xff0c;内容、导航为上下样式布局&#xff0c;通过点击底部tabs切换内容&#xff1b;在md/lg设备上&#xff0c;以[SideBarContainer]形式展示&#xff0c;内容、导…

OZON平台支持什么ERP,芒果店长ERP

随着跨境电商行业的飞速发展&#xff0c;越来越多的电商平台与ERP系统展开了紧密的合作&#xff0c;旨在通过技术整合提升商家的运营效率和市场竞争力。在众多电商平台中&#xff0c;OZON以其独特的商业模式和强大的市场影响力&#xff0c;吸引了众多商家的目光。而芒果店长ERP…

Linux基础知识,配置网卡(七)

一、简介 1. 虚拟机的网络设置 目的1&#xff1a;让物理机和虚拟机之间可以互相通信 目的2&#xff1a;让虚拟机可以上网 目的3&#xff1a;让虚拟机之间可以互相通信 2.网络的类别 类别1&#xff1a;实现物理机和虚拟机之间通信 物理机只要安装了vmware之后&#xff0c;就会…

“SSH服务器拒绝了密码,请再试一次”的问题解决思路

大家在使用XShell工具连接Ubuntu系统时&#xff0c;可能会出现错误如下: 通过在网上查阅资料和实践解决这个问题&#xff0c;将我的思路分享给大家&#xff01; 首先&#xff0c;我会先从使用Xshell连接远程服务器会涉及哪些东西上思考这个问题&#xff0c;即通过ssh服务连接远…

2024年5月软考成绩什么时候出?附查询方式

2024年5月软考成绩查询时间及查询方式&#xff1a; 查询时间&#xff1a;预计在2024年7月上旬进行。 查询方式&#xff1a; 方式一&#xff1a;登陆中国计算机技术职业资格网&#xff08;www.ruankao.org.cn&#xff09;&#xff0c;点击报名系统&#xff0c;输入注册账号和…

ResNet论文解读—Residual Learning Deep for lmage Recognition(2016)

ResNet论文解读—Residual Learning Deep for lmage Recognition&#xff08;2016&#xff09; 研究背景 图像识别中的深度残差学习网络(MSRA:微软亚洲研究院) 认识数据集&#xff1a;ImageNet的大规模图像识别挑战赛 LSVRC-2015&#xff1a;ImageNet Large Scale Visual Rec…

Android 中资源文件夹RES/RAW和ASSETS的使用区别

文章目录 1、res/raw 文件夹1.1、特点1.2、使用方法1.3、示例&#xff1a; 2. assets 文件夹2.1、特点2.2、使用方法2.3、示例&#xff1a; 3、使用场景3.1、res/raw 使用场景3.2、assets 使用场景 4、比较与选择5、文件夹选择的建议6、 示例代码总结6.1、res/raw 示例6.2、ass…

Raven2掠夺者2渡鸦2账号需要验证怎么解决 超简单验证账号教程

《渡鸦2》是一款源自韩国的创新力作&#xff0c;作为《Raven》系列的最新续篇&#xff0c;这款游戏在MMORPG手游领域内再度扩展了其标志性的暗黑奇幻宇宙&#xff0c;融入了大量革新的游戏设计与丰富内容。定档于2024年5月29日开启公测的《渡鸦2》&#xff0c;正处在紧张刺激的…