当前位置: 首页 > 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。它允许您启动链代…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

SpringAI实战:ChatModel智能对话全解

一、引言&#xff1a;Spring AI 与 Chat Model 的核心价值 &#x1f680; 在 Java 生态中集成大模型能力&#xff0c;Spring AI 提供了高效的解决方案 &#x1f916;。其中 Chat Model 作为核心交互组件&#xff0c;通过标准化接口简化了与大语言模型&#xff08;LLM&#xff0…...