当前位置: 首页 > news >正文

C++入门:C语言到C++的过渡

前言:C++——为弥补C缺陷而生的语言

        C++起源于 1979 年,当时 Bjarne Stroustrup 在贝尔实验室工作,面对复杂软件开发任务,他感到 C 语言在表达能力、可维护性和可扩展性方面存在不足。

        1983 年,Bjarne Stroustrup 在 C 语言基础上添加面向对象编程特性,设计出 C++雏形,有了类、封装、继承等核心概念。因此,C++是兼容了C语言的(用过Dev-C++的同学应该不难理解,文件后缀明明是.cpp却可以编译C语言)。

        C++的标准化工作于 1989 年开始,1994 年提出第一个标准化草案。之后联合标准化委员会投票通过将惠普实验室开发的 STL 包含到 C++标准中,这延缓了 C++标准化进程。

        1997 年 11 月 14 日,通过最终草案,1998 年,C++的 ANSI/IS0 标准投入使用。总之,C++是在 C 语言基础上发展而来,弥补了 C 语言的一些不足。

        该文将深入剖析cout和cin两个基本的输入输出函数及其对应运算符,阐述输入输出流的概念,为日后的学习打下牢靠基础。

C++的输入与输出   

  1.引子:C++的第一个程序

        按照传统惯例,第一个程序当然是Hello World了。我们来写一下代码:

// 这⾥的std cout等看不懂没关系,下⾯我们会依次讲解
#include<iostream>
using namespace std;
int main()
{cout << "hello world\n" << endl;return 0;
}

        虽然还没学过,但相信以你的聪明才智,不难看出cout就是输出语句吧。下面我们来正式学习一下。

  2.C++的输入与输出

  • 是 Input Output Stream 的缩写,是标准的输⼊、输出流库,定义了标准的输⼊、输 出对象。
  •  std::cin 是 istream 类的对象,它主要⾯向窄字符(narrow characters (of type char))的标准输 ⼊流。
  •  std::cout 是 ostream 类的对象,它主要⾯向窄字符的标准输出流。
  •  std::endl 是⼀个函数,流插⼊输出时,相当于插⼊⼀个换⾏字符加刷新缓冲区。
  •  <<是流插入运算符,>>是流提取运算符。(C语⾔还⽤这两个运算符做位运算左移/右移)(疑难解答2)
  •  使⽤C++输⼊输出更⽅便,不需要像printf/scanf输⼊输出时那样,需要⼿动指定格式,C++的输⼊ 输出可以⾃动识别变量类型,其实最重要的是 C++的流能更好的⽀持⾃定义类型对象的输⼊输出。(疑难解答1)
  •  cout/cin/endl等都属于C++标准库,C++标准库都放在⼀个叫std(standard)的命名空间中,所以要 通过命名空间的使⽤⽅式去⽤他们。
  •  这⾥我们没有包含<stdio.h>,也可以使⽤printf和scanf,这是因为<iostream>间接包含了<stdio.h>。vs系列编译器是这样的,其他编译器可能会报错。

        好,下面让我们自己动手来写一个简单程序吧:

#include <iostream>
int main() {int num;std::cout << "请输入一个整数: ";std::cin >> num;std::cout << "您输入的整数是: " << num << std::endl;return 0;
}

                           等等!为什么你的cout没有用endl就输出了?

        在默认情况下,使用 std::cout 进行输出时,如果后面没有其他的输出操作紧跟,或者程序没有结束,输出通常会立即显示在屏幕上。

        这是因为输出流有一个默认的刷新机制,对于一些简单的输出语句,即使没有手动使用 std::endl 或其他强制刷新的操作,系统也会适时地将输出内容发送到屏幕上,以提供及时的反馈。

        但如果在复杂的程序环境中,或者有大量的连续输出操作,为了确保输出的及时性和准确性,使用 std::endl 或其他刷新缓冲区的操作会更加可靠。

            那还有!为什么你的Hello用的是cout,这里却变成了std::cout?

        问得好!这个就涉及到命名空间的问题了。你没发现这个程序比上一个程序还少了一个using namespace std;吗?

3.命名空间

        在C/C++中,变量、函数和后⾯要学到的类都是⼤量存在的,这些变量、函数和类的名称将都存在于全 局作⽤域中,可能会导致很多冲突。使⽤命名空间的⽬的是对标识符的名称进⾏本地化,以避免命名 冲突或名字污染,namespace关键字的出现就是针对这种问题的。

        namespace本质是定义出⼀个域,这个域跟全局域各自独立,不同的域可以定义同名变量,这样可以避免命名冲突。

        在使用命名空间中的变量时,可以using namespace 命名空间,这样我们在使用命名空间的域中就可以使用该命名空间中的变量和函数;也可以是命名空间::变量名,这样虽是麻烦些,却有效避免了不同域中相同变量名冲突的情况。

        举个例子:

        这是我们直接用using namespace 的情况,我们主函数就可以使用命名空间bit_le的变量了。

#include <iostream>
namespace bit_le//创建一个命名空间
{int a=798;
}
int main() 
{using namespace bit_le;std::cout<<a;return 0;
}

        结果如下:

         另一种方法如下:

#include <iostream>
namespace bit_le//创建一个命名空间
{int a=798;
}
int main() 
{int a=666;std::cout<<a<<std::endl;//输出主函数域中的astd::cout<<bit_le::a;//输出命名空间“bit_le”中的areturn 0;
}

         结果如下:

        最后,不得不提的⼀般⽇常练习中我们可以using namespace,实际项目开发中不建议using namespace。

        为什么呢?明明看起来直接using namespace一下更简单。这是因为在做复杂项目时,变量名容易重复,导致冲突。我们再举例:

        所以在写较长项目的时候,多敲几下,避免因为冲突造成的bug。

疑难解答

1.对输入输出流的一个基本概念

    在编程中,“流”(Stream)是一种用于处理数据输入和输出的抽象概念

        可以把流想象成一条数据的“河流”,数据在其中连续地流动。

从功能角度来看:

  • 流提供了一种统一的方式来处理不同来源和去向的数据。
  • 无论是从文件读取数据、从网络接收数据、从键盘获取用户输入,还是向屏幕输出、向文件写入数据等,都可以通过流来实现。

从特点角度来看:

  • 流具有连续性和顺序性。数据按照一定的顺序依次通过流进行传输。
  • 流可以是字节流(处理原始的字节数据)或字符流(处理字符数据)。

        在 C++ 中,输入流用于从数据源获取数据,输出流用于将数据发送到数据目的地。

        例如,std::cin 是标准输入流,它可以从键盘获取用户输入的数据。而 std::cout 是标准输出流,用于将数据输出到屏幕。

        流的操作通常具有缓冲机制。这意味着数据可能不会立即被发送或接收,而是先存储在缓冲区中,等到缓冲区满或者遇到特定的刷新操作(如 std::endl)时,才进行实际的传输。

        在文件操作中,std::ifstream 用于读取文件,std::ofstream 用于写入文件,它们也被视为流。

        总的来说,流的概念使得数据的输入和输出处理更加方便、灵活和统一,有助于提高编程的效率和可维护性。

2.从流当中存入及提取数据

        不知道你看完流的概念有没有一个疑惑,反正我学的时候是有的。问题如下:

        我们在使用cout函数进行输出时,似乎并没有向流中存入数据。怎么就从流中提取出来了呢?

        使用 cout 进行输出时,实际上并不是没有事先存入数据。

   cout 是输出流对象,它的工作方式是在您使用插入运算符 << 向它提供数据时,将数据暂时存储在内部的缓冲区中。

        当遇到特定的情况,比如输出换行符 '\n' 、遇到程序结束、缓冲区满或者手动调用刷新缓冲区的操作(如 std::endl)时,存储在缓冲区中的数据才会被实际输出到目标设备(通常是屏幕)。

        所以,虽然看起来是直接进行了输出,但实际上是先将数据存入了缓冲区,只是这个过程对于您来说是自动和隐式处理的。

         我们来举个例子:

#include <iostream>int main() {std::cout << "Hello";  // 数据暂时存储在缓冲区sleep(5);//停留5秒程序接着运行std::cout << " World";  // 数据继续存储在缓冲区std::cout << std::endl;  // 遇到换行符,刷新缓冲区,输出之前存储的数据return 0;
}

        嗯~好,这上个问题刚解决,下个问题就出来了。

        明明“out”是“出”,“in”是“入”。你说cout是插入用的,那cin是干嘛的?口说无凭,你得给我证明!

        cout的确是输出语句,但要先用“<<”将内容存入流。遇到std::endl时输出之前存入的数据(什么?你说你经常不加endl也正常输出了?别急,马上讲)。

        cin是输出语句,用“>>”将流中的数据赋值给变量。例如,如果要从标准输入读取一个整数并存储到变量 num 中,我们会这样写:cin >> num ,这里就像是从输入流中把数据“拉出来”并存放到 num 里。

相关文章:

C++入门:C语言到C++的过渡

前言&#xff1a;C——为弥补C缺陷而生的语言 C起源于 1979 年&#xff0c;当时 Bjarne Stroustrup 在贝尔实验室工作&#xff0c;面对复杂软件开发任务&#xff0c;他感到 C 语言在表达能力、可维护性和可扩展性方面存在不足。 1983 年&#xff0c;Bjarne Stroustrup 在 C 语言…...

了解MVCC

概念 MVCC&#xff0c;全称Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;是一种并发控制的方法&#xff0c;维护一个数据的多个版本&#xff0c;使得读写操作没有冲突&#xff0c;快照读为MySQL实现MVCC提供了一个非阻塞读功能。MVCC的具体实现…...

WPF自定义控件的应用(DynamicResource的使用方法)

1 DynamicResource的使用方法 可以在字典文件 的抬头区写入数&#xff1a; <SolidColorBrush x:Key"PrimaryBackgroundColor" Color"#FFABAdB3"/><SolidColorBrush x:Key"TextBox.MouseOver.Border" Color"#FF7EB4EA"/>&l…...

Postgresql数据库密码忘记的解决

当您忘记PostgreSQL数据库的密码时,可以通过以下步骤来重置密码。这些步骤在Windows和Linux操作系统上大体相同,但具体操作路径和命令可能有所不同。 步骤一:找到并修改pg_hba.conf文件 定位安装目录: Windows:通常在PostgreSQL的安装目录下的data文件夹中。Linux:位置可…...

Flink SQL 基础操作

Flink SQL是建立在Apache Flink之上的SQL处理引擎&#xff0c;它允许用户以SQL的方式处理流数据和批数据。以下是一些Flink SQL的基础操作&#xff1a; 一、环境准备 1.启动flink集群 ./start-cluster.sh启动sql-client ./sql-client.sh二、数据源定义 创建表&#xff08;…...

海思AE模块Lines_per_500ms参数的意义

​ 基础知识 1秒(S)1000毫秒(ms)1000_000微妙(s)1000_000_000纳秒(ns) 1GHz1000Mhz1000_000KHz1000_000_000Hz 1Hz1/s 抗频闪原理 海思AE模块参数中有一个LinesPer500ms的参数&#xff0c;意思为500ms对应的曝光行数。此个参数和抗频闪有关。 我们知道&#xff1a; 50HZ…...

【代码随想录】区间和——前缀和方法

本博文为《代码随想录》学习笔记&#xff0c;原文链接&#xff1a;代码随想录 题目 原题链接&#xff1a;58. 区间和&#xff08;第九期模拟笔试&#xff09; 题目描述 给定一个整数数组 Array&#xff0c;请计算该数组在每个指定区间内元素的总和。 输入描述 第一行输入为…...

Bug 解决 | 前端项目无法正确安装依赖?

目录 1、网络问题 2、权限问题 3、版本冲突 4、缓存问题 5、依赖配置错误 6、系统环境问题 前端项目和后端项目一样&#xff0c;都需要用到很多第三方的类库依赖。目前基本上我们主流的前端项目都使用 Npm、Yarn 等包管理工具来管理项目依赖&#xff0c;正常情况下通过执…...

【mysql 第四篇章】bin log 的作用是啥呢?

一、redo Log 介绍 redo log 是一种偏向物理性质的重做日志&#xff0c;因为他里面记录类似的这样的东西&#xff0c;“对那个数据也中的什么记录&#xff0c;做了个什么修改”。它是 InnoDB 存储引擎特有的东西。 二、bin Log 日志 bin log 叫做归档日志&#xff0c;它里面…...

Linux 操作系统:基于环形队列的生产者消费者模型

Linux 操作系统&#xff1a;基于环形队列的生产者消费者模型 一、前言二、大致框架二、P操作、V操作三、生产者生产数据四、生产者获取数据五、代码测试六、所有代码 一、前言 环形队列采用数组模拟&#xff0c;用模运算来模拟环状特性。和基于阻塞队列的生产者消费者模型不同的…...

python求解二次方程

为了找到x和y之间的关系&#xff0c;并假设这种关系是一个二次函数&#xff0c;我们可以使用numpy的polyfit函数来拟合一个二次方程&#xff08;即形式为y ax^2 bx c的方程&#xff09;。然后&#xff0c;我们可以使用matplotlib来绘制散点图&#xff0c;并在图上添加最佳拟…...

Spring框架面试总结

Spring基础 什么是spring框架 Spring 框架是一个用于构建企业级 Java 应用程序的开源框架。【Java项目快速构建轻量级框架】我们一般说 Spring 框架指的都是 Spring Framework&#xff0c;它是很多模块的集合&#xff0c;使用这些模块可以很方便地协助我们进行开发。【根据模…...

java之网络编程篇

前言 网络编程就是计算机和计算机之间通过网络进行数据传输&#xff0c;下面介绍一些概念和如何实现UDP和TCP两种模式的传输。 一、常见的软件架构C/S和B/S C/S架构需要一个客户端软件程序服务器 B/S只需要打开网页服务器 C/S架构的优缺点和应用场景 优点&#xff1a;画面可以…...

stm32f103c8t6与TB6612FNG解耦测试

stm32f103c8t6与TB6612FNG解耦测试 本文操作方式: 忽略底层,只做上层, 所以前面全部照搬步骤,重在调试 文章目录 stm32f103c8t6与TB6612FNG解耦测试本文操作方式:创建基本工程(1)跳转此链接,创建(2)创建电机驱动文件夹(3)PWM原理(4)电机转动控制 oled调试和key调试(5)OLED转速…...

2253336 - 资源库 - OAC0 中的脱机状态

症状 资源库的状态显示为离线。 环境 SAP 内容服务器 6.50 或更高版本与 MaxDB 存储媒介结合使用对于状态为离线的资源库&#xff0c;测试报表 RSCMST 运行正常资源库可在应用程序中使用&#xff0c;没有任何问题 重现问题 启动事务 OAC0双击资源库按 "CSADMIN"…...

uni-app总结

1. <u-form-item label"报废人" ><u--input v-model"model.remark" border"bottom" placeholder"请输入"></u--input> </u-form-item> border"bottom" 报废日期 为了...

【JavaEE初阶】线程安全的集合类

&#x1f4d5; 引言 我们之前讲过的集合类&#xff0c;,大部分都不是线程安全的. Vector, Stack, HashTable, 是线程安全的(都是自带了synchronized,不建议用), 其他的集合类不是线程安全的。 注意&#xff1a;加锁不能保证线程一定安全&#xff0c;不加锁也不能确定线程一定…...

关于Vue项目npm快捷键,点击run启动报错,及npm i也报错的解决办法

1.配置idea的npm 2.点击运行按钮 3.结果 分析原因及问题&#xff1a; npm i npm run dev 由于是刚刚从gitlab新拉的前端代码&#xff0c;可能没有用命令install过类似于没有编译过&#xff0c;所以执行一下上面的命令 结果报错如下&#xff1a; F:\tbyf\qjyy\hip-manager-ui&…...

React中,className属性自定义组件不生效的问题

在React中&#xff0c;className属性不仅适用于原生的HTML元素&#xff0c;也可以用于自定义组件。实际上&#xff0c;className属性是React中通用的属性&#xff0c;可以应用于任何React元素&#xff0c;无论是原生的HTML元素还是自定义的组件。 为什么使用className而不是cl…...

Ubuntu22.04搭建fabric开发环境、开发环境下运行链码

在智能合约开发过程中&#xff0c;开发人员需要一种快速、迭代地测试链码包的方法&#xff0c;而无需为每次修改运行链码生命周期命令。 使用 Fabric 二进制文件并启动peer处于开发模式&#xff08;“DevMode”&#xff09;&#xff0c;然后将链码连接到peer。它允许您启动链代…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

JVM 内存结构 详解

内存结构 运行时数据区&#xff1a; Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器&#xff1a; ​ 线程私有&#xff0c;程序控制流的指示器&#xff0c;分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 ​ 每个线程都有一个程序计数…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...