cout还是printf?C++教程 - How to C++系列专栏第4篇
关于专栏
这个专栏是优质的C++教程专栏,如果你还没看过第一篇,点击这里去第0篇
本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C++编译器:Clang
感谢一路相伴的朋友们,感谢你们的支持 ^ _ ^
博主反馈非常及时,如果你在阅读的时候遇到问题,可以直接在评论区提问,博主看到后会在24小时内给你反馈
C++教程 - How to C++系列专栏第4篇
目录
关于专栏
前言
cout和printf的区别
语言层面
printf
cout
实现层面
printf
cout
类型安全是什么
总结
结语
快捷翻页
本文参考文章,书籍
前言
How to C++系列特别篇,让我们探讨一下到底是cout还是printf适合我们
cout和printf的区别
语言层面
printf
printf属于C语言stdio.h头文件,是C语言的组成部分,是C语言标准库中的函数,用于向标准输出设备按规定格式输出信息
cout
cout属于C++的iostream头文件,不同于printf,cout属于原生C++的输出
实现层面
我们知道,cout和printf的基础功能是一样的:在屏幕上打印我们要求输出的字符
printf
printf其实是C语言中的一种函数,printf实际上是调用了一个函数,C作为C++的子集,自然在C++中也可以使用printf,但并不具备类型安全(具体看下面)
cout
cout本质上来讲其实是一个对象,属于ostream类,ostream类在iostream中有定义,具备类型安全
类型安全是什么
类型安全是指在程序中,变量和表达式在赋值、运算和访问时,其类型是可靠且符合预期的。类型安全可以确保程序在运行时不会发生类型错误,例如变量值被赋予了错误的类型,或者使用了不正确的操作符
类型安全是编程语言设计中的一个重要概念,它有助于提高程序的可靠性和可维护性。在类型安全的语言中,编译器会根据类型信息检查程序的正确性,并捕捉可能存在的不安全或错误操作。这种早期错误检测可以避免程序在运行时出现崩溃或产生意外的结果
类型安全的语言通常具有以下特点:
- 静态类型检查:编译器在编译时对程序进行类型检查,而不是在运行时。这有助于在代码执行之前发现潜在的类型错误
- 强制类型转换:类型安全的语言通常不允许开发者直接将一种类型的值转换为另一种类型。相反,它们提供了强制类型转换的操作符,以确保类型转换是安全的
- 数组和字符串操作:类型安全的语言通常提供对数组和字符串的内置操作,这些操作是类型安全的,可以避免数组越界和字符串拼接错误
- 输入检查:类型安全的语言通常会进行输入检查,以防止非法或不安全的输入。例如,它们可以检查输入是否符合预期的格式或范围
值得注意的是,完全的类型安全并不总是可能的。有些语言可能会允许某些类型的未定义行为或类型错误。然而,类型安全仍然是一个有用的工具,可以帮助程序员避免许多常见的错误和问题
懵了?举个例子
假设我们有一个电子秤,我们可以用它来称量不同重量的物品
如果我们将一个重10公斤的物品放在电子秤上,然后将其设置为称量1公斤的物品,那么电子秤就会因为重量超出了预设范围而无法正常工作
在编程中,类型安全的作用类似于这个电子秤
假设我们有一个函数,该函数接受一个字符串作为输入,并将其转换为整数。如果我们将一个包含非数字字符的字符串传递给该函数,那么该函数就会因为无法将非数字字符转换为整数而抛出异常或错误。这就是类型安全的作用,它确保了程序在运行时不会因为类型错误而崩溃或产生意外的结果。
在现实生活中,类型安全的概念可以应用于许多不同的场景。例如,当我们使用银行卡支付时,我们的交易金额必须与卡的限额匹配,否则交易就会失败。当我们使用医疗设备时,我们必须确保输入的数据是正确的类型和范围,否则可能会导致错误的诊断或治疗
总之,类型安全是一种编程概念,它确保了程序在运行时不会因为类型错误而崩溃或产生意外的结果。在现实生活中,类型安全的概念可以应用于许多不同的场景
C语言在这方面做的并不好,在C语言中,变量的类型通常是在声明时确定的,如果大家学到后面会明白,实际上变量只是一个内存地址,这个地址存储特定类型的值。程序员可以直接访问该地址,并使用任何可用的数据类型。因此,在C中类型检查不是强制性的,而是由程序员自己负责的
与此相比,C++引入了静态类型检查,这意味着编译器会在编译时执行类型检查。C++中的每个变量都有其特定的类型,并且不允许直接将一个类型的值赋给另一个类型的变量,除非进行显式的类型转换
总结
其实我们可以看出,cout可能在某些环境下效率没有printf高,但总体来说,cout具备的功能确实跟优秀,并且具备类型安全,不会把程序员搞的一头雾水,满脸懵
当然,任何工具都有好有坏,在一些情况下确实printf更好用,cout也有缺点
在我们之后的学习中一般会使用cout作为输出
结语
作者会经常帮助有问题的小伙伴解决问题如果你有问题,可以直接到评论区指出,作者会在看到后到24小时内给予答复
如果本文有任何问题欢迎在评论去指出,如果喜欢这篇文章,希望能点赞评论关注
感谢一路相伴的朋友们,有你们是我的福气
如果你们身边有像你提起过这个领域的,或者希望可以和ta一起进步的,把这个专栏分享给ta吧
2400字,7个父项,2个子项,5个孙子项
快捷翻页
C++教程 - How to C++系列专栏第0篇
C++教程 - How to C++系列专栏第1篇
C++教程 - How to C++系列专栏第2篇
C++教程 - How to C++系列专栏第3篇
本文参考文章,书籍
参考文章
文心一言
C++ 中 printf 和 cout 什么区别? - 知乎
https://wenku.csdn.net/answer/9f0f30f47cc346d49f77ece1c2124349
C++ 中 printf 和 cout 什么区别? - 知乎
C++ 中 printf 和 cout 什么区别? - 知乎
参考书籍
C++ Primer Plus
相关文章:
cout还是printf?C++教程 - How to C++系列专栏第4篇
关于专栏 这个专栏是优质的C教程专栏,如果你还没看过第一篇,点击这里去第0篇 本专栏一致使用操作系统:macOS Ventura,代码编辑器:CLion,C编译器:Clang 感谢一路相伴的朋友们,感谢…...

Linux NTP原理及配置使用
一、NTP简介 1.NTP简介 NTP(Network Time Protocol,网络时间协议)是用来使网络中的各个计算机时间同步的一种协议。它的用途是把计算机的时钟同步到世界协调时UTC,其精度在局域网内可达0.1ms,在互联网上绝大多数的…...
SAP系统是什么呢?它有哪些优势?
SAP系统是全球知名的企业资源规划(ERP)解决方案供应商。它集成了财务、供应链管理、人力资源管理、销售和客户关系管理等多个功能模块,为企业提供全面、集成的管理体验。SAP系统已成为各行各业企业管理的智慧选择,极大地提升了管理…...
js数组学习(ES6+)
文章目录 js(ES6)数组学习1.Array.prototype.forEach(fn)2.Array.prototype.map(fn)3.Array.prototype.filter(fn)4.Array.prototype.reduce(fn)5.Array.prototype.some(fn) every6.Array.prototype.find(fn)7.Array.prototype.includes(item) js(ES6)数组学习 1.Array.protot…...

DoIP诊断入门
简介 DoIP(Diagnosis over Internet Protocol)是一种用于车辆诊断的网络通信协议。它基于现代互联网技术,允许通过以太网或IP网络进行车辆诊断和通信。 DoIP的背景是现代车辆中使用的电子控制单元(ECU)数量不断增加&…...

Amazon CloudFront 部署小指南(五)- 使用 Amazon 边缘技术优化游戏内资源更新发布...
内容简介 游戏内资源包括玩家的装备/弹药/材料等素材,对游戏内资源的发布和更新是游戏运营商的一个常规业务流程,使用频率会十分高,所以游戏运营商希望该流程可以做到简化和可控。针对这个需求,我们设计了 3 个架构,面…...

undefined reference to `dlopen‘ ‘SSL_library_init‘ `X509_certificate_type‘
使用Crow的时候需要注意crow依赖asio依赖OpenSSL,asio要求1.22以上版本,我使用的是1.26.0; 这个版本的asio要求OpenSSL是1.0.2,其他版本我得机器上编不过,ubuntu上默认带的OpenSSL是1.1.1; 所以我下载了OPENSSL1.2.0重…...

DHCPv6之GitHub项目Android侧验证
一、adb里面安装busybox 1、下载busybox 下载网址:Index of /downloads/binaries/1.21.1 (busybox.net),目前最新是1.21.1版本 根据项目选择busybox-armv7l ,右键另存为下载到本地目录,下载后去掉文件的后缀名,变成如…...

简单易懂的 Postman Runner 参数自增教程
目录 什么是 Postman Runner? Postman Runner 如何实现参数自增? 步骤一:设置全局参数 步骤二:将全局参数带入请求参数 步骤三:实现参数自增 资料获取方法 什么是 Postman Runner? Postman Runner 是…...

BeanFactory与Applicationcontext(1)
BeanFactory是接口,提供了IOC容器最基本的形式,给具体的IOC容器的实现提供了规范。BeanFactory是spring的“心脏”,核心容器,它也是Applicationcontext的父接口。 BeanFactory实质上并未提供过多的方法,spring容器的I…...

C++初阶之模板深化讲解
模板深化讲解 非类型模板模板的特化1.函数模板特化2.类模板特化 模板分离编译1.什么是分离编译2.模板的分离编译 模板总结 非类型模板 非类型模板(Non-Type Template)是 C 中的一种模板形式,它允许你在模板中传递除了类型以外的其他值&#x…...
Redis数据结构——整数集合
定义 整数集合是集合的实现方式之一,当一个集合只包含整数值元素时,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合的底层实现。 整数集合就是存放整数的一个数组,整数集合的结构体定义: typeof struc…...

背上大书包准备面试之CSS篇
目录 H5 新特性 css3新特性? 为什么要初始化css样式? 浏览器兼容性问题? css sprites(css精灵图)? css盒模型是什么样的? 页面中一个块元素的宽度包含了盒模型中的哪些部分?…...
linux系列基本介绍
虽然我们常说Linux操作系统,这种叫法是不正确的,严格意义上讲,Linux并不是操作系统,而是属于操作系统的一个内核,inux内核提供了操作系统的核心功能,如进程管理、内存管理、文件系统等。 Linux有很多不同的…...

vue.draggable浅尝
介绍 Vue.Draggable是一款基于Sortable.js实现的vue拖拽插件。支持移动设备、拖拽和选择文本、智能滚动,可以在不同列表间拖拽、不依赖jQuery为基础、vue 2过渡动画兼容、支持撤销操作,总之是一款非常优秀的vue拖拽组件。本篇将介绍如何搭建环境及简单的…...

Tree相关
1.树相关题目 1.1 二叉树的中序遍历(简单):递归 题目:使用中序遍历二叉树 思想:按照访问左子树——根节点——右子树的方式遍历这棵树,而在访问左子树或者右子树的时候我们按照同样的方式遍历࿰…...
git日常操作-案例
文章目录 查看远程有那些分支 查看远程有那些分支 git ls-remote --heads origin...
cmake链接.lib库
当使用CMake编写CMakeLists.txt文件来链接其他文件夹的.lib库文件时,你需要做以下几个步骤: 设置库文件路径: 使用 link_directories() 函数设置要搜索库文件的路径。例如: link_directories(${CMAKE_SOURCE_DIR}/path/to/libra…...
SkyWalking 部署(包含ES)
SkyWalking安装 结构 首先SkyWalking主要需要oapService、webApp、Elasticsearch(可选存储)三个,接下来讲一下这三个的安装步骤,安装过程中出现了一些细小的配置错误,导致用了快两天才弄好,麻木了&#x…...

Android学习之路(2) 设置视图
一、设置视图宽高 在Android开发中,可以使用LayoutParams类来设置视图(View)的宽度和高度。LayoutParams是一个用于布局的参数类,用于指定视图在父容器中的位置和大小。 下面是设置视图宽度和高度的示例代码: …...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
Vue 模板语句的数据来源
🧩 Vue 模板语句的数据来源:全方位解析 Vue 模板(<template> 部分)中的表达式、指令绑定(如 v-bind, v-on)和插值({{ }})都在一个特定的作用域内求值。这个作用域由当前 组件…...

【Veristand】Veristand环境安装教程-Linux RT / Windows
首先声明,此教程是针对Simulink编译模型并导入Veristand中编写的,同时需要注意的是老用户编译可能用的是Veristand Model Framework,那个是历史版本,且NI不会再维护,新版本编译支持为VeriStand Model Generation Suppo…...