C++学习之旅 第二章 printf与cout

2023-11-12

目录

1.printf简介

 2.printf的四种用法

2.1 printf("字符串");

2.2 printf("输出控制符",输出参数);

2.3 printf("输出控制符1 输出控制符2  ,,,,,,,, ", 输出参数1, 输出参数2,....... );

2.4 printf("输出控制符 非输出控制符 ",输出参数);

3.printf为什么需要输出控制符

4.cout简介

cout的三种用法

5.1 std::cout

5.2 加上using namespace std;可不用在前面加上std::

5.3 在using namespace std; std后面加上::cout

 6.cout和i/i++/++i的组合使用

 7.iomanip库用法总结

8.结尾


1.printf简介

      printf函数是格式化输出函 ,数,一般用于向标准输出设备按规定格式输出信息。在C++中产生格式化输出的函数。其向终端输出字符。printf中的f的意思是format,它的作用是按照指定的格式输出数据。printf也是C++中很重要的一个函数,它能让用户可以与程序交流,是一个多才多艺的函数。                                                                                                                                                     printf 将变量的内容输出到显示器上。

 函数原型;                                     int     (    const   char  *  format,       ...   );

 2.printf的四种用法

2.1 printf("字符串");

这是我们最开始接触用法 hallo world就这种用法

#include<iostream>
int main()
{
	printf("hallo world!\n");  //\n是换行
	return 0;
}

其中的hallo world可以用任意字符代替 比如THE WORLD 白金之星之类的

2.2 printf("输出控制符",输出参数);

#include<iostream>
int main()
{
    int i = 5;
    printf("%d", i);  //d是十进制
    return 0;
}

假设这里我写的是5,也就是把5的二进制代码用十进制表示出来。所以在这里的 i 指的不是5而是5的二进制代码,不同的格式所表现的不一样,如

#include<iostream>
int main()
{
    int i = 100;
    printf("%X", i);  //X是十六进制
    return 0;
}

  这里是把100的二进制代码用十六进制表现出来,结果是64,因此可以体现输出控制符的重要性。它决定了把二进制代码以什么形式输出的。

2.3 printf("输出控制符1 输出控制符2  ,,,,,,,, ", 输出参数1, 输出参数2,....... );

当然了这其中输出控制符1对应输出参数1,2对应2,依此类推。

#include<iostream>
int main()
{
    int j = 6;
    int k = 9;
    printf("%d %d\n", j, k);
    return 0;
} 

  这里我们不能用一个%d表示两个参数,因为语法不是这样规定的(创始人这样规定的没办法)。同时输出控制符与输出参数的个数必须匹配,一一对应。

2.4 printf("输出控制符 非输出控制符 ",输出参数);

这里我们需要了解的是什么是输出控制符,什么是非输出控制符。作为初学者,我认为带%的大部分应该都是。比如 %d %f %x %c之类的。

#include<iostream>
int main()
{
    int f =47;  //100是十进制
    printf("%x" ,f)         //输出结果是2f
    printf("%X" ,f)         //输出结果是2F
    printf("%#X" ,f);       //输出结果是0x2F
    printf("%#x" ,f);       //输出结果是0x2f
    return 0;
}

这里%#X的优势就体现出来了,有了0x可以体系这是十六进制。

     输出控制符包括如下

                                  %d        --    int

                                  %ld       --    long int

                                  %c        --    char

                                  %f         --    float

                                  %lf        --    double

                                  %x        --    int 或 long int 或 short int

                                  %o        --    同上

                                  %s        --    字符串

我们运用非输出控制符可以使程序更美观,比如这样:

#include<iostream>
int main()
{
    int j = 6;
    int k = 9;
    printf("j = %d, k = %d\n", j, k);  //输出结果j = 6,k = 9
    return 0;
}

这么一看,这不漂亮多了,这样让人看得也很舒服明了!

然后,我给大家解释一下程序后面写的"\n"是什么意思,\n,就是换行一下,写\n可以让屏幕换一个行,接下来输出的都会在下一行!

3.printf为什么需要输出控制符

  

首先,01组成的代码可以表示数据也可以表示指令,打个比方,010101010111000这一串它表示的是一个数字还是一个字符还是一个电影或图片,这我们无法知道。这01本身没有含义,取决我们如何来解读。所以必须要有有输出控制符来解读,要不然谁知道这是啥意思。

其次,如果01组成的代码表示的是数据的话,那么同样的01代码以不同的格式输出就会有不同的输出结果。所以我们就需要一个输出控制符。


4.cout简介

  cout 是C++中 ostream 类型的对象,该类被封装在 < iostream > 库中,该库定义的名字都在命名空间 std 中,所以 cout 全称是 std::cout 。

  在cout这个类里面,有着非常重要的函数,可以用里面的函数输出(由于是新手篇,这里就不多讲了),还有一个,而已cout<<数字/字符串;大家可能不知道,"<<"是左移运算符的意思,作用是将一个二进制数的值左移一位,但是在cout上面意思就不好说通了,如果是数字那还好说,但是是字符串的话,怎么转化为二进制,怎么左移?

  所以这个<<并不是左移运算符的意思,在这里,我给大家普及一下知识:这是运算符重载,重载是什么意思呢?就是一个函数,名称相同,类型相同,但是里面的参数不相同,编译器是允许运行的,这就形成了重载关系,在这个otream类里面,将<<运算符重载了一遍,这样就可以进行输出了(新手篇,具体内容不细讲).

如果大家想要了解运算符重载的知识,可以看一下我的这篇文章:

C++运算符重载总结_龙星尘的博客-CSDN博客一定要自定义一个拷贝构造函数,这样在重载运算符返回对象副本的时候,编译器会自动调用拷贝构造函数,否则会出现结果错误。把‘=’运算符重载为类成员变量,并且将返回值设计成为该类的引用。除了‘=’运算符以外,其他的运算符重载最好设计成为友元函数。这就是我们今天要讲的运算符重载的总结.友元关系不会被派生类继承。https://blog.csdn.net/wo_ai_luo_/article/details/127791616

cout的三种用法

前提:如果程序中想使用 cout ,需要包含库 < iostream > 。

5.1 std::cout

因为 cout 是 std 库中的一个类的对象,所以使用的方法是 std::cout ,如下:

#include <iostream>
int main(){
	int i;
	std::cin >> i;
	std::cout << i << std::endl;
	return 0;
}

这样子比较麻烦,所有的都要加std::,个人建议不要这种输出.

5.2 加上using namespace std;可不用在前面加上std::

  在C++里面,有一个std的命名空间,使用了之后,就方便很多了,不用在前面加上std::了!

使用 std 命名空间:

#include <iostream>
using namespace std;
int main(){
	int i;
	cin >> i;
	cout << i << endl;
	return 0;
}

这样,后面程序中可以直接使用 cout ,而且std中的其他名字也可以直接使用,如 cin 、 endl 等。

5.3 在using namespace std; std后面加上::cout

#include <iostream>
using namespace std::cout;
int main(){
	int i;
	std::cin >> i;
	cout << i << std::endl;
	return 0;
}

这样,后面程序中只可以直接使用 cout ,而 std 中的其他名字不可以可以直接使用(这种方式一般情况下不建议使用,但是有些题很特殊,可能需要这样来办)。

 6.cout和i/i++/++i的组合使用

i++ 和 ++i 是有着不同的含义,和 cout 组合使用也会得到不同的结果,下面给出一段代码:

#include <iostream>
using namespace std;
int main(){
	int i = 1;
	cout << ++i << i++ << i << i++ << ++i << endl;
	return 0;
}

这段代码的结果是多少呢?
A.23345
B.22335
C.54535
D.53525

我们不妨先理解一下 cout 输出控制台的过程。看下面这幅图:

根据表达式来看, endl 会作为一个可以供 cout 接收的对象往前传,而 ++i 和 endl 结合起来作为一个可以供 cout 接收的对象往前传,依次递推下去。物理实现上需要一个栈来保存可以供 cout 接收的对象,然后从右向左放到这个栈里,然后依次弹出输出在屏幕上。其中, i 和 ++i 会在栈里面保存 i 的引用,而 i++ 会在栈里面保存数字,过程如下:

第一步:将 endl 压入栈中, i 值不变;
第二步:将 i 的引用压入栈中, i 的值加 1 变成 2(因为是 ++i );
第三步:将 2 压入栈中, i 的值加 1 变成 3(因为是 i++ );
第四步:将 i 的引用压入栈中, i 的值不变(因为是 i );
第五步:将 3 压入栈中, i 的值加 1 变成 4(因为是 i++ );
第六步:将 i 的引用压入栈中, i 的值加 1 变成 5(因为是 ++i );
第七步:将栈里的数据依次弹出,即可得到 53525 。(因为i的值是 5 ,所以所有 i 的引用都是 5 )

 7.iomanip库用法总结

iomanip是cout里面的头文件库,给大家讲一下:

< iomanip > 库封装了很多对输入输出流的操作,常见用法总结如下:

控制符    作用
setbase(n)    以n进制方式输出(n=8,10,16)
setfill(ch)    设置字符填充,ch可以是字符常量或字符变量
setprecision(n)    设置输出有效位数为n位
setw(n)    设置字符宽度为n位,只对后一个有影响
setiosflags(ios::uppercase)    以大写字母显示
setiosflags(ios::fixed)    实现对小数点后的数字的控制
setiosflags(ios::scientific)    以科学计数法显示
setiosflags(ios::showpoint)    强制显示小数点
setiosflags(ios::showpos)    强制显示正号
setiosflags(ios::left)    设置输出左对齐
setiosflags(ios::right)    设置输出右对齐
resetiosflags(…)    终止括号中的输出格式

8.结尾

  第6点和第7点比较难理解,里面设计到了C++的高级数据结构栈,已经各种库函数,在新手篇里面做一个普及的作用.

最后,感谢大家的观看!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++学习之旅 第二章 printf与cout 的相关文章

  • 无法使用c#更改视频捕获分辨率

    我正在尝试使用 C 中的 DirectShowNet 更改默认网络摄像头分辨率 据我所知 我需要通过调用 windows win32 api dll 中内置的 VideoInfoHeader 类来更改它以进行 avi 捕获 我有来自 Dir
  • 如何在 ASP.NET MVC 中将 XML 文件发送到客户端

    在 ASP NET MVC 中 我有一个数据库表 我想在某个视图页面上有一个按钮 如果某个用户单击该按钮 我的应用程序将生成包含数据库中所有行的 XML 文件 然后 应将包含 XML 的文件发送到客户端 以便用户看到下载弹出窗口 同样 我希
  • 更新 Azure Blob 上的 LastModified

    我正在移植代码以使用 C 中的 Azure 存储 SDK 传统上 我称其为更新修改文件的上次写入 修改时间 File SetLastWriteTimeUtc fileName lastWriteTimeUtc 要更新 blob 的上次修改时
  • 头文件中实现的函数的静态与内联

    我想到的方式inline在 C 中用于链接 作用域 我把它放在同一个篮子里extern and static对于全局对象 通常 对于在头文件中实现的函数 我的首选解决方案是将其设为静态 In Foo h static void foo Do
  • Winform DatagridView 数字列排序

    我只使用一个简单的 DataGridView 来保存一堆数据 有趣的是 我在特定列中有小数 但是当按小数列排序时 它的排序是错误的 例如 起始顺序可能是 0 56 3 45 500 89 20078 90 1 56 100 29 2 39
  • 对 ExecuteNonQuery() 的单次调用是原子的

    对 ExecuteNonQuery 的单次调用是否是原子的 或者如果单个 DbCommand 中有多个 sql 语句 那么使用事务是否有意义 请参阅我的示例以进行说明 using var ts new TransactionScope us
  • 如何通过 libwebsocket 发送异步数据?

    我正在将 Warmcat 的 libwebsocket C 库用于小型 Websocket 服务器 我已经启动并运行了这些示例 并且可以发送数据以响应从 websocket 接收数据 例如回显发送的反向字节 但是 我无法弄清楚如何在不使用
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 为什么像 BindingList 或 ObservableCollection 这样的类不是线程安全的?

    我一次又一次发现自己必须编写 BindingList 和 ObservableCollection 的线程安全版本 因为当绑定到 UI 时 这些控件无法从多个线程更改 我想理解的是why情况就是这样 这是设计错误还是故意的 问题是设计一个线
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • C# 中的抽象类和接口类有什么不同?

    C 中的抽象类和接口类有什么不同 An 接口不是类 它只是一个contract定义了public一个类的成员must实施 抽象类只是一个类 您从中可以cannot创建一个实例 通常您会使用它来定义一个基类 该基类定义了一些virtual方法
  • 使用 OleDbCommand / OleDbDataAdapter 读取 CSV 文件

    我不明白为什么 但是当我使用 OleDbDataAdapter 或 OleDbCommand 读取 CSV 文件时 在这两种情况下 生成的数据结构良好 它识别文件头中的列 但行数据都是空字符串 我之前已经成功进行过多次 CSV 处理 因此我
  • 从具有相同属性的另一个对象创建对象

    我有一个 C 对象 可以说有 20 个属性 它是数据契约的一部分 我还有另一个具有类似属性的业务实体 我想从响应对象中填充该实体 除了将一个对象的每个属性分配给另一个对象的相应属性之外 还有其他方法可以做到这一点吗 是的 看看自动映射器 h
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • 'iter' 的名称查找已更改为新的 ISO 'for' 范围

    我正在尝试编译下面的两个文件 但从编译器收到错误消息 gcc 4 3 3 Linux 错误位于带有以下符号的行 LINE WITH ERROR 我做错了什么 我该怎么改变 路易斯 g c b h b cpp b cpp In functio
  • C - 获取外部IP地址

    我需要通过 C C 调用获取我的公共 IP 地址 我知道作为替代方案 我可以从 http whatismyip akamai com 等外部链接获取 我写了一个示例来获取外部IP地址 但我的程序没有返回外部 IP 地址 我正在获取内部 IP
  • 为什么 C++ 标准没有将 sizeof(bool) 定义为 1?

    Size of char signed char and unsigned char由 C 标准本身定义为 1 个字节 我想知道为什么它没有定义sizeof bool also C 03 标准 5 3 3 1 说 sizeof char s
  • 检查一个数是否是完全平方数?

    我认为以下代码存在精度问题 bool isPerfectSquare long long n long long squareRootN long long sqrt n 0 5 return squareRootN squareRootN
  • Asp.Net Core 中的 SSL 不起作用

    我从 Visual Studio 创建了一个简单的 Web 应用程序Web Application Net Core 具有个人用户帐户授权的模板 然后 我启用了 SSLProject gt MyProject Properties 将带有

随机推荐

  • 控制台get的两种提交方式

    本次学习需要打开Visual Studio 2015简称 VS 开发工具 其他的版本也可以使用 打开进入页面创建项目 创建的项目命名为控制台get提交的两种方式 之后我们在软件默认的位置 保存的位置可以进行更改 之后就到更改的位置中查找 中
  • axios 请求自动携带 cookie

    axios 请求自动携带 cookie axios默认是不让ajax请求头部携带cookie的 添加withCredentials设置 const instance axios create baseURL http 127 0 0 1 3
  • Java 实现暴力匹配算法(也称为朴素字符串匹配算法)

    摘要 暴力匹配算法 也称为朴素字符串匹配算法 是一种简单但有效的字符串匹配算法 它通过遍历主串和模式串的每一个字符 并在遇到不匹配的情况下逐个后移字符进行匹配 本文将使用Java语言实现暴力匹配算法 并对其性能进行简要分析 介绍 字符串匹配
  • C 简介

    原文链接 https www runoob com cprogramming c intro html C 语言是一种通用的高级语言 最初是由丹尼斯 里奇在贝尔实验室为开发 UNIX 操作系统而设计的 C 语言最开始是于 1972 年在 D
  • 每日一问—03如何拆分指定页码pdf

    一 各页码范围合成一个整体的pdf import PyPDF2 导入PyPDF2模块 def merge pdf pages input pdf page ranges output pdf reader PyPDF2 PdfFileRea
  • 越来越智能的云,如何助力实体经济?

    2023 年腾讯全球数字生态大会即将举行 每一年的大会 腾讯都会带来新的思考和实践 今年也不例外 今年 大会的主题是 智变加速 产业焕新 意即数字经济正发生的变化 以大语言模型为代表的人工智能 正在带来全新的科技变革 如何为实体经济创造新的
  • 西门子PLC通信全解析

    前言 最近西门子PLC价格大幅上调 在工控界引起了不小的风波 不仅涨价 甚至还缺货 导致很多人不得不更改方案 听说最近已经完成了芯片替换 希望不久能够恢复供货 并把价格回调 通过这件事 从侧面可以看出 西门子在工控领域的市场占有率很大 那么
  • Oracle date(时间)类型详解

    常用日期型数据类型 TIMESTAMP类型是DATE类型的一个扩展 DATE类型会存储年月日时分秒信息 TIMESTAMP类型精度更高 会存储到微秒 纳秒 1 DATE 展示格式既可以为 YYYY MM DD 也可以为YYYY MM DD
  • 数据分析课程笔记(二)绘制散点、条形、直方图 Numpy简介

    数据分析课程笔记 绘制散点图 绘制条形图 绘制横着的条形图 例子 绘制直方图 直方图更多场景 常见问题总结 matplotlib使用流程 matplotlib更多的图形样式 更多绘图工具 numpy numpy创建数组 矩阵 numpy中常
  • Adams——SolidWorks模型导入到Adams中

    1 SOLIDWORKS模型转入ADAMS的格式及导入步骤 首先将零件图或者装配图另存为 parasolid格式 其次将保存好的 parasolid格式文件的后缀改为 xmt txt 之所以这样做可以避免模型中多个实体的重复 注意保存路径不
  • 【经验分享】让iPad或者手机作为电脑扩展屏幕使用—Splashtop Wired XDisplay(亲测有效且免费)

    最近 由于疫情的影响只能进行居家隔离办公 平时习惯使用双屏幕 在家一台笔记本操作有点不适应 由此想到拿手里的ipad实现电脑扩展屏 网上看了有很多可以实现 iPad 如何实现电脑屏幕扩展 有 Duet Display TwomonUSB s
  • typedef和#define的用法与区别

    typedef和 define的用法与区别 一 typedef的用法 在C C 语言中 typedef常用来定义一个标识符及关键字的别名 它是语言编译过程的一部分 但它并不实际分配内存空间 实例像 typedef int INT typed
  • Markdown 让你专注于写作而不是排版(极品,你学习它只需5分钟)

    http jianshu io p q81RER 献给写作者的 Markdown 新手指南 http jianshu io p qqGjLN 为什么作家应该用 Markdown 保存自己的文稿 http jianshu io users y
  • 统计学--基于R(第3版)(基于R应用的统计学丛书)作者:贾俊平 习题答案 第七章

    7 1 7 1 检验各月份的销量是否符合均匀分布 0 05 H0 符各均匀分布 H1 不符合均匀分布 load C exercise ch7 exercise7 1 RData exercise7 1 chisq test exercise
  • Android是怎么启动的-[Android取经之路]

    Android取经之路 的源码都基于Android Q 10 0 进行分析 Android取经之路 系列文章 系统启动篇 Android系统架构Android是怎么启动的Android 10 0系统启动之init进程Android10 0系
  • c++实现时钟(图形实现)

    由于该项目是win32项目 且在VS2019上实现的 故现在简单一下在VS2019上如何创建与为win32项目相同的windows桌面向导程序 1 首先打开vs2019创建新项目 2 然后选择Windows桌面向导程序 3 然后点击下一步创
  • springboot2+alibaba sentinel的整合小坑

    pom配置
  • 【深入了解pytorch】PyTorch循环神经网络(RNN)

    深入了解pytorch PyTorch循环神经网络 RNN PyTorch循环神经网络 RNN 概念 工作原理与常见变体 循环神经网络概念和工作原理 RNN的结构 RNN的工作原理 LSTM 长短期记忆网络 LSTM的结构 LSTM的工作原
  • Windows中Splinter的安装和使用

    核心内容 1 Splinter的简介 2 Splinter的安装 3 检验Splinter是否安装成功 4 Geckodriver驱动的安装 5 Splinter的操作示例 一 Splinter的简介 Splinter是一个使用Python
  • C++学习之旅 第二章 printf与cout

    目录 1 printf简介 2 printf的四种用法 2 1 printf 字符串 2 2 printf 输出控制符 输出参数 2 3 printf 输出控制符1 输出控制符2 输出参数1 输出参数2 2 4 printf 输出控制符 非