是 printf("%d %d", c++, c); 的输出结果也未定义?

2023-12-03

最近看到一个帖子cout 并想知道是否输出

int c = 0;  
printf ("%d %d", c++, c);  

也是未定义的??

我在讲座中研究过后缀和前缀运算符仅在获得分号后才增加值。所以根据我的说法,输出0 0是正确的 !!!


我在讲座中研究过后缀和前缀运算符仅在获得分号后才增加值。

把你的讲师发给我,这样我就可以拿棒球棒给他礼貌地指出他的错误。

正是当前置或后缀的副作用++ and --被应用的是未指定,除了要求它发生在下一个序列点之前。在这样的表达中

x = a++ * b

a之后可能会立即更新a++已评估,或者更新可能会推迟到a++ * b已被评估并将结果分配给x,或介于两者之间的任意位置。

这就是为什么像这样的表达式i++ * i++ and printf("%d %d", c++, c) and a[i++] = i还有很多其他的都是坏juju。根据编译器、优化设置、周围代码等,您将得到不同的结果。语言标准明确保留了行为不明确的因此编译器没有义务“做正确的事情”,无论正确的事情是什么。请记住,定义未定义的行为 is

3.4.3

1 undefined behavior
behavior, upon use of a nonportable or erroneous program construct or of erroneous data, for which this International Standard imposes no requirements

2 NOTE Possible undefined behavior ranges from ignoring the situation completely with unpredictable results, to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message).

3 EXAMPLE An example of undefined behavior is the behavior on integer overflow.

这是一个经过深思熟虑的设计决策 - 未指定这些操作的顺序的理由是让实现自由地重新安排评估顺序以达到优化目的。然而,作为这种自由的交换,某些操作将不会产生明确的结果。

请注意,编译器可以自由地try检测这些病例并发出诊断;printf("%d %d", c++, c);很容易被发现,但在一般情况下这将是一个很难检测到的问题。想象一下如果这样写的话printf("%d %d", (*p)++, c); if p指着c,那么行为是未定义的,否则没关系。如果p被分配在不同的翻译单元中,那么在编译时就无法知道这是否是一个问题。

这个概念并不难理解,但却是最容易被误解的概念之一。taught)C 语言方面。毫无疑问,这就是为什么 Java 和 C# 语言规范强制对所有内容采用特定的求值顺序(所有操作数都从左到右求值,并且所有副作用都会立即应用)。

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

是 printf("%d %d", c++, c); 的输出结果也未定义? 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • 不支持将数据直接绑定到存储查询(DbSet、DbQuery、DbSqlQuery)

    正在编码视觉工作室2012并使用实体模型作为我的数据层 但是 当页面尝试加载时 上面提到的标题 我使用 Linq 语句的下拉控件往往会引发未处理的异常 下面是我的代码 using AdventureWorksEntities dw new
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 类模板参数推导 - clang 和 gcc 不同

    下面的代码使用 gcc 编译 但不使用 clang 编译 https godbolt org z ttqGuL template
  • BitTorrent 追踪器宣布问题

    我花了一点业余时间编写 BitTorrent 客户端 主要是出于好奇 但部分是出于提高我的 C 技能的愿望 我一直在使用理论维基 http wiki theory org BitTorrentSpecification作为我的向导 我已经建
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • WCF 中 SOAP 消息的数字签名

    我在 4 0 中有一个 WCF 服务 我需要向 SOAP 响应添加数字签名 我不太确定实际上应该如何完成 我相信响应应该类似于下面的链接中显示的内容 https spaces internet2 edu display ISWG Signe
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur

随机推荐

  • 我是否需要调整令牌权限才能成功调用 CreateRemoteThread?

    我正在为我的应用程序开发一个调试工具 以帮助我诊断死锁 该应用程序在我客户的计算机上运行 因此我期望有广泛的操作系统 安全策略等 我使用的技术是在目标应用程序中实现一个函数 该函数生成所有线程的堆栈跟踪以及其他诊断信息 然后将其写入内存映射
  • Python 中的“无法启动新线程错误”

    我正在运行一个脚本 该脚本从 debian 软件包中提取信息并将其保存在数据库中 从大约 100 个包中提取信息后 出现错误 错误是 无法启动新线程 为什么我会遇到这个错误 可能的解决方案是什么 这是用于保存数据的代码 for i in l
  • 使用 Java-8 Streams API 将字符串列表转换为映射

    我有清单 List
  • 吉他调音器频率

    我正在为 iOS 制作一个吉他调音器Objective C 由于事实上我是Beginner我正在努力收集有关它的所有资源和信息 我知道这个理论 如果我错了 请纠正我 首先我需要从麦克风获取输入 然后需要申请申请FFT获取频率的算法 然后比较
  • ASP.NET C# 添加/更新用户到角色

    大家好 我有一个页面显示住宿信息 然后显示在详细信息视图中创建该信息的人的用户 ID 我还有一个按钮 应该查看该用户 ID 单击该按钮时将该用户 ID 转换为用户名 以便我可以使用该用户名将人员角色更改为租户 但是我不确定使用 C 如何从详
  • LINQ 与 SPARQL 的比较? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我不是 MS NET 用户 但对 LINQ 感到好奇 这篇文章http www linqpad net WhyLINQBeatsSQL aspx很好地解释了为什么它比 SQL 更
  • 功能请求:gwan.h 中包含的atomicAdd() 函数

    在 G WAN KV 选项中 KV INCR KEY将使用第一个字段作为主键 这意味着 G WAN 核心中已经内置了一个以原子方式递增的函数 以使该主索引正常工作 最好将此函数开放给 servlet 使用 即包含在 gwan h 中 通过这
  • 如何在div上叠加图像?

    我想在边框上放置一个小的圆形登录图像div这样半个图像将在边界线之外只是为了样式目的 我想我必须设置 z index 但如何或有没有更好的方法 这正是您需要做的 给你 img 一个类名 然后在你的样式表中添加类似这样的内容 classnam
  • 有什么方法可以在 JavaScript 中识别浏览器选项卡吗?

    我需要能够识别我在浏览器中的哪个选项卡 难道我不能从浏览器中获取一些信息来识别该选项卡吗 我不需要知道任何其他选项卡的任何信息 我只需要我所在选项卡的 id 它可以是随机数或序列号 也可以是日期时间戳 只要它与当前选项卡保持不变即可 选项卡
  • 是否可以通过 api 获取提交更改(仅限差异)?

    我试图通过 api 提取提交更改 而我得到的只是文件本身的路径 就像整个文件一样 我想要实现的是查看每次提交的单个文件的更改 仅差异 例如 如果我使用 Github 查询相同的内容 我会得到如下的差异 1 0 0 n console log
  • 如何提高单字符PrefixQuery性能?

    我有一个包含 150 万个文档的 RAMDirectory 并且我正在使用 PrefixQuery 搜索单个字段 当搜索文本长度为3个或更多字符时 搜索速度极快 不到20毫秒 但当搜索文本长度小于 3 个字符时 搜索甚至可能需要整整 1 秒
  • 有没有办法在 WPF 中创建粘性页脚?

    我想在 WPF 中添加粘性页脚 这是我在这个主题上发现的唯一问题 有没有办法在 xaml 中创建粘性页脚 但答案创造了一个fixed页脚 不是sticky footer
  • 如何组合列数略有不同的多个表

    我有多个表 其中大约有 10 个公共列 但有些表有 1 2 个额外列 我想将所有这些表组合成一个表 每个表中的每一行都有一行 每个特定行的源表中不存在的任何列都具有 NULL 值 所以我的输入大致如下 table1 id colA colB
  • NSDate:处理一天中时间的正确方法?

    我正在制定指定一天中不同时间的时间表 例如上午 10 30 不过 我不知道日期 我将把这些作为值存储在NSDictionary并希望以直接的方式处理他们 我不能使用NSDate 因为我没有约会 至少 不是以一种直接的方式 另一种看似显而易见
  • unionWith 的终止检查

    我在终止检查时遇到问题 与中描述的问题非常相似这个问题还有这个Agda 错误报告 功能请求 问题是让编译器相信以下内容unionWith终止 使用重复键的组合功能 unionWith合并表示为按键排序的 键 值 对列表的两个映射 有限映射的
  • Netlogo 发芽的海龟间隔不到一处

    我想将海龟放置在每个黑色斑块上 下图 这样海龟之间就没有间隙 我现在使用的代码 ask patches with pcolor black sprout dead turtles wall agents set color red 这给出了
  • 使用分治法求一个数的n次方根

    我需要有关如何求某个数字的 n 次方根的帮助 用户输入数字 n 和他想要根的数字 我需要在没有 cmath lib 的情况下使用分而治之的方法来解决这个问题 这是我的代码 目前还无法运行 include
  • 如何从C#调用Java代码?

    我们开发了一个 Java 应用程序 并希望从 C 客户端使用该应用程序 该应用程序依赖于 Spring Log4j 最有效的机制是什么 从 Java 代码创建 DLL 来实现这一目标 IKVM 真是太棒了 唯一的问题是它确实为项目增加了约
  • ScrollViewer 不滚动

    我想要一个包含 3 个组件的界面 一个挨着一个 第一个是 ListView 另外两个是 Grid 由于组件会在右侧溢出 因此我想将它们放在 ScrollViewer 中 我没有成功 我尝试做一个非常简单的例子来尝试 但即使这个例子也失败了
  • 是 printf("%d %d", c++, c); 的输出结果也未定义?

    最近看到一个帖子cout 并想知道是否输出 int c 0 printf d d c c 也是未定义的 我在讲座中研究过后缀和前缀运算符仅在获得分号后才增加值 所以根据我的说法 输出0 0是正确的 我在讲座中研究过后缀和前缀运算符仅在获得分