printf(“%d,%d\n“,i--,i++)

2023-10-27

// sample.cpp

#include<iostream>
using namespace std;

int main(){
	int i=1;
	printf("Case 1:	%d,%d\n",i--,i++);

	i=1;
	printf("Case 2:	%d,%d\n", i++, ++i);
	
	i=1;
	printf("Case 3:	%d,%d,%d\n", i++, ++i, ++i );
	
	return 0;
}

运行结果:

 

原因:

参考链接:https://blog.csdn.net/u014644714/article/details/77688321

 

---

首先看几种情况

1、

int i=1;
printf("%d,%d\n",i--,i++);
运行结果为:2,1

这与编译器有关,通过汇编可以很清楚的看到

第一步:把i的值存入缓存器[ebp-0E8h]=1;

第二步:i值加1,i=i+1=2;

第三步:把i的值存入缓存器[ebp-0ECh]=2;

第四步:i值减1,i=i-1=1;

第五步:把缓存器[ebp-0E8h]=1,入栈

第六步:把缓存器[ebp-0ECh]=2,入栈

 

故,打印输出为 2,1

 

总结:

由++或者--运算的顺序是从右向左,故先计算i++,i++在计算过程中会产生缓存区,返回的值就是缓存区的值,既是在加1之前需要先备份,这里的缓存区地址就是[ebp-0E8h]=1,

之后,i=i+1=2;

同理,第二个表达式的缓存区[ebp-0ECh]=2,

之后,i=i-1=1;

然后把第一,第二个表达式的返回值分别入栈【1,2】故输出为 2 1;

2、

int i=1;
printf("%d,%d\n",i++,++i);

 

第一步:i值加1,i=i+1=2;

第二步:把i的值存入缓存区[ebp-0E8h]=2;

第三步:i值加1,i=i+1=3;

第四步:把i=3,入栈

第五步:把缓存区[ebp-0E8h]=2,入栈

故,输出为2,3

总结:

由++或者--运算的顺序是从右向左,故先计算++i,++i的返回值为i本身,本应该是2,但是后面的运算却影响i的值,另外printf输出流的缓存栈是在所有表达式计算完后再入栈的,只需要知道首先入栈的是i的地址里面存的值,

下面该表达式i++,i++在计算过程中会产生缓存区,返回的值就是缓存区的值,既是在加1之前需要先备份,这里的备份地址就是[ebp-0E8h]=2,之后i=i+1=3,返回的值为缓存区[ebp-0E8h]=2,第二次入栈的就是第二个表达式的返回值[ebp-0E8h]=2,而第一次入栈的是第一个表达式的返回值i的值(此时已经改为3),故输出栈里面是【3,2】,打印输出 2,3.

 

下面的几个例子是具有两个变量的,道理是类似的,要注意,具有后置++/--的,返回的都是缓存区的值,前置的都是返回变量本身的值,另外本身的值可能受另一个表达式的影响,所以,在没有计算完之前,是不知道i的值的。

1、

int x=2,y=3;
printf("%d,%d\n",(x++)+y,++y);//等价x+++y

 

第一个入栈的是y值本身,而其他表达式对其无影响,故入栈y==4

第二个入栈的是表达式的缓存区的值,为x+y=2+4=6,故入栈 6

输出值为6 4

下面的例子可以自己分析试试,看看反汇编就立刻明白含义了,就不一一说明了

2、

int x=2,y=3;
printf("%d,%d\n",x+y++,++y);


3、

int x=2,y=3;
printf("%d,%d\n",x+y,++y);

 

4、

int x=2,y=3;
printf("%d,%d\n",x+y,y++);
 
 
 

 

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

printf(“%d,%d\n“,i--,i++) 的相关文章

  • C++ 维护子类对象的混合集合

    如果我在这里错过了一个相当基本的概念 我很抱歉 但我正在尝试弄清楚如何维护多个类类型的集合 所有类类型都派生自同一个父类 并且在检索它们时仍然可以访问它们的特定于子类的方法从集合中 作为上下文 我有一个基类 BaseClass 和许多类 例
  • 适合初学者的良好调试器教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有谁知道一个好的初学者教程 在 C 中使用调试器 我感觉自己好像错过了很多 我知道怎么做 单步执行代码并查看局部变量 虽然这常常给我带来问
  • ComboBox DataBinding 导致 ArgumentException

    我的几个类对象 class Person public string Name get set public string Sex get set public int Age get set public override string
  • 如何在C(Linux)中的while循环中准确地睡眠?

    在 C 代码 Linux 操作系统 中 我需要在 while 循环内准确地休眠 比如说 10000 微秒 1000 次 我尝试过usleep nanosleep select pselect和其他一些方法 但没有成功 一旦大约 50 次 它
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 从同一个类中的另一个构造函数调用构造函数

    我有一个带有两个构造函数的类 C 这是代码片段 public class FooBar public FooBar string s constructor 1 some functionality public FooBar int i
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • File.AppendText 尝试写入错误的位置

    我有一个 C 控制台应用程序 它作为 Windows 任务计划程序中的计划任务运行 此控制台应用程序写入日志文件 该日志文件在调试模式下运行时会创建并写入应用程序文件夹本身内的文件 但是 当它在任务计划程序中运行时 它会抛出一个错误 指出访
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • C# 存档中的文件列表

    我正在创建一个 FileFinder 类 您可以在其中进行如下搜索 var fileFinder new FileFinder new string C MyFolder1 C MyFolder2 new string
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 为什么我的单选按钮不起作用?

    我正在 Visual C 2005 中开发 MFC 对话框应用程序 我的单选按钮是 m Small m Medium 和 m Large 它们都没有在我的 m Summary 编辑框中显示应有的内容 可能出什么问题了 这是我的代码 Pizz
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • Unity:通过拦截将两个接口注册为一个单例

    我有一个实现两个接口的类 我想对该类的方法应用拦截 我正在遵循中的建议Unity 将两个接口注册为一个单例 https stackoverflow com questions 1394650 unity register two inter
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • String.Empty 与 "" [重复]

    这个问题在这里已经有答案了 可能的重复 String Empty 和 有什么区别 https stackoverflow com questions 151472 what is the difference between string
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 如何使用 C++11 using 语法键入定义函数指针?

    我想写这个 typedef void FunctionPtr using using 我该怎么做呢 它具有类似的语法 只不过您从指针中删除了标识符 using FunctionPtr void 这是一个Example http ideone

随机推荐

  • webdriver.Chrome()报错:selenium.common.exceptions.WebDriverException: Message: 'chromedriver' ...

    使用selenium模块的webdriver打开谷歌浏览器的时候报错 源代码如下 from selenium import webdriver browser webdriver Chrome print type browser brow
  • 12-8 副作用与纯函数

    1 副作用 函数副作用 指当调用函数时 除了返回函数值之外 还对主调用函数产生附加的影响 例如修改全局变量 函数外的变量 或修改参数 表达式副作用 在表达式求值过程中 需要获取变量的值 但并不改变这些变量的值 这样的表达式称为无副作用的表达
  • 关于Visual Studio内登录microsoft账号白屏问题的解决办法

    如果连接常规Wi Fi无效的话可尝试以下方法 1 断开Wi Fi连接 关闭程序 2 打开手机热点 使电脑连接上 3 再次打开程序进行输入账号与密码的操作 4 此时尝试登录可有效避免白屏卡顿现象 亲测有效 PS 本人WiFi为中国电信 手机卡
  • 怎样使用Cubase进行人声消除

    所谓分离伴奏 指的就是消除人声 通常在一首歌曲的音频文件中 混音师一般都会将人声放在声像位置的正中间再输出为一个立体声音频文件 一般情况下是这样 但不代表全是这样 因此 人声的波形在该立体声音频文件的左声道和右声道中应该是相同或相似的 所以
  • 不好意思, Maven 该换了!

    相信使用Java的同学都用过Maven 这是一个非常经典好用的项目构建工具 但是如果你经常使用Maven 可能会发现Maven有一些地方用的让人不太舒服 一来Maven的配置文件是XML格式的 假如你的项目依赖的包比较多 那么XML文件就会
  • SLAM代码(三维重建)

    版权声明 本文为博主原创文章 遵循 CC 4 0 BY SA 版权协议 转载请附上原文出处链接和本声明 本文链接 https blog csdn net wendox article details 52719252 三维重建的一般步骤 特
  • 爬虫隐藏自身的ip并伪装成浏览器

    爬虫隐藏自身的ip并伪装成浏览器 使用代理访问 就是说使用代理 代理 访问url之后 再将网页的内容在传给本机的 使用代理访问 import urllib request import random url http www whatism
  • 堆排序【C语言】

    堆排序 基本思想 利用堆 小顶堆 进行排序的过程 首先把待排序序列 R1 R2 Rn 转换成一个堆 这时 根结点具有最小值 输出根结点 可以将其与堆数组中的末尾元素交换 此时末尾元素就是最小值 然后将剩下的n 1个结点重新调整为一个堆 反复
  • vue-element el-table 使用sortablejs拖拽排序

    需求描述 vue element admin开发过程中需要对el table行进行排序 即每一行可以上下移动 然后将排序后的数据传给后台更新数据 该表格无分页 问题分析 方法一 可以采用在每条数据中加两个上下移动的按钮 每次移动一行 该方法
  • 自制脚本语言(12) 作用域与符号表

    摘要 介绍了自制语言的编译器对符号表的处理 YF语言中 符号表的基本结构是hash表 每个AST 附带了3个hash表 变量表 类型表 函数表 例如
  • python Django项目点击run或debug时出现Type ‘manage.py help <subcommand>‘ for help on a specific subcommand.

    报错 D python3 7 python exe E code dailyfresh test1 test2 manage py Type manage py help
  • python requests cookies怎么转为_如何将requests.RequestsCookieJar转换为字符串

    新答案 好吧 所以我还是不知道你到底想达到什么目的 如果您想从requests RequestCookieJar对象中提取原始url 这样您就可以检查是否与给定的子域匹配 这是 据我所知 不可能的 不过 你也可以做些类似的事情 usr bi
  • Linux-线程的同步与互斥

    线程的同步与互斥 进程 线程间的互斥相关背景概念 互斥量 互斥量接口 互斥量的初始化 互斥量的销毁 加锁和解锁 改善抢票系统 互斥量原理 可重入与线程安全 重入和线程安全的概念 常见线程不安全情况 常见线程安全的情况 常见不可重入情况 常见
  • 【软件工程】-可行性研究报告

    GB8567 88 可行性研究报告 1引言 1 1编写目的 为了提高机房收费管理的灵活性和效率 减轻机房工作人员的工作负担 节约时间 对机房收费业务做到快速准确管理的目的 从而降低人力 经济的更各方面的消耗 本次编写主要是为了分析廊坊师范学
  • 电机速度曲线规划1:梯形速度曲线设计与实现

    电机驱动是很常见的应用 在很多系统中我们都会碰到需要改变电机的速度以实现相应的控制功能 这就涉及到电机速度曲线规划的问题 在这篇中我们就来简单讨论一下电机的梯形曲线规划的问题 1 基本原理 梯形速度曲线控制算法是工业控制领域应用最为广泛的加
  • 在vc下环境变量的设置

    Error spawning cl exe 编译出错 有人说是没有设置 include环境变量 下面介绍在vc下如何设置环境变量 1 Microsoft Visual Studio下面3个子文件夹 Common VC98 My Projec
  • 1.嵌入式控制器EC学习,编译环境搭建

    工欲善其事 必先利其器 在学习EC相关知识之前 首先需要完成EC代码编译环境的搭建 需要如下内容 Keil C51 用于EC中C代码的编译器环境 EC源代码 我们使用从网上可以下载到的 ITE V12 4 Update 版的代码为例进行学习
  • JavaBean,List,Map转成json格式

    普通JavaBean 以User为例 转成json格式 1 转成JSONArray类型 User user new User user setUsername cxl user setPassword 1234 JSONArray json
  • GORM 基础 -- Gen

    https gorm io gen github 1 GEN Guides GEN 友好和更安全的代码生成 1 1 概述 来自动态原始SQL的惯用和可重用API 100 类型安全的DAO API 不使用 interface Database
  • printf(“%d,%d\n“,i--,i++)

    sample cpp include