在同一行使用变量时的预自增运算符

2024-06-20

我相信我想做的事情可能是有效的,因为它在两种情况下都用逗号分隔(不是典型的作业),但我不确定并且搜索不会显示有关这两个的任何内容具体情况。

在这两种情况下,我都使用变量作为两个并行数组的索引。

int a[3] = {10, 20, 30};
int b[3] = {20, 40, 60};

情况#1:初始化数组的结构

struct testStruct {
     int t1;
     int t2;
};
int i = 0;
testStruct test = {a[++i], b[i]}

最终行的预期结果:test = {20, 40}

情况#2:将数组中的特定值作为函数参数传递

void testFunc(int t1, int t2) {
    // do stuff
}
int i = 0;
test(a[++i], b[i]);

最终行的预期结果:test(20, 40)

这是有效的代码吗?如果是,它在所有编译器中都有效吗?

结果是我所期望的吗?如果是这样,是因为数组还是因为逗号?

Thanks!


我建议不要在代码中使用此类“技巧”,从长远来看,这是维护噩梦,而且很难推理。几乎总是有替代方案,例如以下代码:

testStruct test = {a[++i], b[i]}

可以改为:

++i ;
testStruct test = {a[i], b[i]}

话虽如此,这两种情况都在函数调用和初始化列表中使用逗号运算符,逗号只是语法元素,仅此而已。

您的第一种情况已明确定义,但有一些警告取决于这是 C++11 还是 C++11 之前的版本。

在这两种情况下,每个逗号后面都有一个序列点,尽管 C++11 之前的版本未指定计算顺序。因此,我们可以通过以下方式查看 C++11 之前的情况:缺陷报告 430 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#430其中说:

最近的 GCC 错误报告(http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11633 http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11633)询问有关 的有效性

int count = 23;   int foo[] = { count++, count++, count++ };

这是未定义或未指定还是其他什么?

答案是(强调我的前进):

我相信标准是明确的每个初始化表达式 上面是一个完整的表达式(1.9 [介绍.执行]/12-13;另见 问题 392),因此每个后面都有一个序列点 表达式 (1.9 [intro.execution]/16)。我同意该标准确实 似乎没有规定表达式求值的顺序, 也许应该如此。有谁知道有一个编译器不会 从左到右评估表达式?

在 C++11 中,它被烘焙在C++11 标准草案 http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3485.pdf在部分8.4.5段落说:

在花括号初始化列表的初始化列表中, 初始化子句,包括任何由包扩展产生的子句 (14.5.3),按照它们出现的顺序进行评估。那是, 与给定相关的每个值计算和副作用 初始化子句在每次值计算之前排序,并且 副作用与它后面的任何初始化子句关联 初始化列表的逗号分隔列表。

我坚持使用 C++11,因为它不会改变其余内容的答案,尽管排序的措辞确实有所不同,但结论是相同的。

第二种情况调用未定义的行为 http://en.wikipedia.org/wiki/Undefined_behavior因为函数参数的求值顺序是未指定的,并且它们的求值相对于彼此的顺序是不确定的。我们可以从部分看到这种未定义的行为1.9段落15其中说:

除非另有说明,否则各个运算符的操作数的评估 和 各个表达式的子表达式是无序的。 [ 注意:在计算期间多次计算的表达式中 程序的执行,无顺序和不确定顺序 其子表达式的计算不需要一致地执行 在不同的评价中。 —尾注] 的值计算 运算符的操作数在计算值之前进行排序 运算符的结果。如果标量对象的副作用是 相对于同一标量上的另一个副作用而言,未排序 对象或使用相同标量的值的值计算 对象,行为未定义.

并提供以下示例:

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

在同一行使用变量时的预自增运算符 的相关文章

  • 遍历后加快数组查找速度?

    我有一个123MB大的int数组 它基本上是这样使用的 private static int data new int 32487834 static int eval int c int p data c 0 p data p c 1 p
  • 是否可以使静态控件透明?

    我正在尝试实现一个静态控件 该控件刷新 更改文本 以响应每秒发生一次的某个事件 由于我不想每秒绘制整个客户区域 所以我决定使用静态控件 现在的问题是父窗口被蒙皮 这意味着它有自定义位图作为背景 而静态控件没有适应 所以我正在寻找使静态控件的
  • 以 ISO 8601 格式输出日期

    如何在 C 中获取以下格式的日期 2016 04 26T19 50 48Z include
  • 您使用什么工具和技术来查找死代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 您使用哪些工具和技术来查找 NET 中的死代码 过去 我用 Obsolete 属性修饰方法 传递 tr
  • OWIN AuthenticationOptions 在 mvc5 应用程序中运行时更新

    Hi 情况如下 我在 iis 7 上有一个带有 Identity 2 的 MVC 5 应用程序 该应用程序为多个网站提供服务 主机名是某些网站的关键 网站 另一个网站 等等 我决定在我的所有网站上使用谷歌外部登录 每个网站都应该是带有个人
  • 在宏中使用 # [重复]

    这个问题在这里已经有答案了 请解释一下代码 include
  • 错误 C2065:'cout':未声明的标识符

    我正在处理我的编程作业的 驱动程序 部分 但我不断收到这个荒谬的错误 错误 C2065 cout 未声明的标识符 我什至尝试过使用std cout但我收到另一个错误 IntelliSense 命名空间 std 没有成员 cout 当我宣布u
  • 如何在 C++ 中从模板基类的构造函数调用模板超类的构造函数?

    我正在使用 sublimetext3 用 c 进行编程 我的程序有一个名为 Array 的超类和一个名为 IntArray 的子类 这两个类都是模板类 目前 我在编译该程序时遇到问题 它不断在我的 IntArray cpp 文件中给出错误
  • 测试从 ComboBox 派生的自定义控件

    我创建了一个从 ComboBox 派生的控件 并希望对其行为进行单元测试 但是 它在我的单元测试中的行为似乎与实际应用程序中的行为不同 在实际应用程序中 Combobox DataSource 属性和 Items 同步 换句话说 当我更改
  • Linux C++ 调试器

    我正在寻找完美的 Linux C 调试器 我不期望成功 但搜索应该提供丰富的信息 我是一个非常有能力的 gdb 用户 但 STL 和 Boost 很容易压垮我的调试技能 并不是说我无法深入了解数据结构的内部结构 而是它需要很长时间 我通常会
  • 持续运行的 C# 代码 - 服务还是单独的线程?

    我有一个 NET 4 Web 应用程序 它有 3 个关联的独立项目 DAL BAL 和 UI 我正在使用实体框架进行数据库交互 我有代码循环遍历一堆数据库数据 根据找到的内容调用方法 然后更新数据库 我希望这段代码一直运行 同时 我希望用户
  • 如何在 WCF 中反序列化自定义 SOAP 标头?

    我正在尝试向通过 WCF 的所有 SOAP 请求添加自定义标头 我发现这篇精彩的文章 http blogs msdn com b mohamedg archive 2012 10 21 adding custom soap headers
  • 第三方引用的 dll 未被复制来构建

    我有一个第三方 net dll 被我的 dll 类库项目 A 引用和使用 我的控制台应用程序项目 B 引用项目 A 我的问题是第三方 dll 没有被复制到控制台应用程序项目 B 的构建中 这里有什么问题呢 我的 dll 类库中引用的第三方
  • OpenMP 循环数组访问中的错误共享

    我想利用 OpenMP 来并行执行我的任务 我需要将数组的所有元素减去相同的数量并将结果写入另一个向量中 两个数组都是动态分配的malloc第一个填充了文件中的值 每个元素都有类型uint64 t pragma omp parallel f
  • WPF MVVM后台打印数据绑定问题

    我正在使用 wpf mvvm 开发一个销售点应用程序 在交易生命周期的许多阶段 都会在后台打印收据 我已经使用其他示例在后台生成和打印收据 我正在后台打印一个 UserControl 一切看起来都很棒 然后 我为该控件创建了 ViewMod
  • 实体框架中的导航属性是什么

    我是实体框架的新手 当Visual Studio创建模型图时我们主要可以看到Entities Propertie和Navigation Properties这两个东西 那么这些Navigation Properties是什么 如何使用它们
  • 为什么 ASP.Net MVC Range 属性采用类型?

    我只是想知道为什么范围验证属性可以采用类型和两个字符串作为参数 这是为了根据枚举或类似的东西验证字符串吗 另外 我想做的是找到一种简单的方法来验证必须出现在枚举中的 3 个字符的字符串 有什么建议吗 谢谢 亚历克斯 我确实发现你提到的 Ra
  • 使用反射检测属性的访问修饰符类型

    我编写了一些代码来使用反射查看属性 我已经使用反射从类中检索了属性列表 但是我需要查明该财产是公共的还是受保护的 例如 public string Name get set protected int Age get set Propert
  • 如何从与 C# lambda 集成(而非代理集成)的 Amazon API 网关获取正确的 http 状态代码?

    我正在使用 C lambda 与 API 网关集成 我希望 API 网关返回正确的错误代码 例如 400 404 500 等 API网关模块tf文件 provider aws version lt 2 70 0 region var aws
  • Json.net 将数字属性序列化为字符串

    我正在使用 JsonConvert SerializeObject 序列化模型对象 服务器期望所有字段都是字符串 我的模型对象具有数字属性和字符串属性 我无法向模型对象添加属性 有没有办法将所有属性值序列化为字符串 我必须只支持序列化 而不

随机推荐

  • WPF:如何避免图像超出 Canvas 的边界?

    我有一个画布作为图像查看器 它的背景用于放置图像 我想在其上面放置另一个图像 所以 场景是这样的
  • 使用最小起订量模拟第 3 方回调事件

    我们一直在尝试为用 C 编写的工作类编写单元测试 该类使用 moq 模拟第三方 API 基于 COM 来动态创建模拟对象 NUnit 是我们的单元测试框架 这个第三方组件实现了几个接口 但还需要使用事件回调到我们的工作类 我们的计划是模拟这
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • npm package.json bin 无法在 Windows 上运行

    我正在尝试通过 package json 启动我的 cli 工具bin财产 我有以下内容 name mycli bin bin mycli 当我在包路径中打开 cmd 并输入 mycli 时 它表示该命令无法识别 我应该运行 npm 命令吗
  • C# PrimaryContext 未找到网络路径

    我正在尝试使用 PrimaryContext 来检查远程计算机上是否存在本地用户组 我遇到问题PrincipalContext PrincipalContext ctx new PrincipalContext ContextType Ma
  • 如何保护 iOS 应用程序免受任何操作系统攻击(在越狱设备上)

    我希望保护我的应用程序数据 以防任何操作系统攻击或越狱 iOS 设备上的未经授权的访问 在这种情况下 有什么方法可以检测此类威胁并保护应用程序数据 虽然我同意 jrturton 的说法 但如果您有想要保护的关键数据免受流氓应用程序 而不是用
  • 是否可以为枚举类枚举器添加别名?

    给定一个 C 11 枚举类 嵌套在几个长且丑陋的命名空间中 namespace long and ugly enum class colour red green blue 枚举值可以使用别名吗 使用 clang 3 5 可以执行以下操作
  • 当 URL 包含片段时,iframe 会导致父元素在 Google Chrome 上向上滚动

    在 Google Chrome 37 0 2062 122 OSX Windows 上 具有包含片段的 URL 的 iframe 会导致父元素向上滚动 它只发生在 Chrome 中 在 Safari 和 Firefox 中测试 这是显示问题
  • Redis 会话序列化器 3.2 和 4.2 之间不匹配

    我有一个基于 Spring Cloud 的应用程序在多个 spring boot 服务器上运行 所有服务器使用 EnableRedisHttpSession共享相同的Spring Session 我现在想将第三方小部件集成到我的应用程序中
  • Android 中多个蓝牙连接的自定义 UUID

    我有一个 Android 设备作为服务器连接到多个蓝牙 Android 客户端 我了解 UUID 的概念以及它的独特之处 我的问题是 我可以为连接到我的服务器的所有客户端使用相同的 UUID 吗 如果没有 我如何以编程方式为我的客户端生成
  • C# 7 表达式主体构造函数

    在 C 7 中 如何使用 2 个参数编写这样的表达式主体构造函数 public Person string name int age Name name Age age 一种方法是使用元组和解构来允许在一个表达式中进行多次赋值 public
  • 为什么 Visual C++ 6 抱怨私有析构函数

    以下代码适用于 Visual C 2008 但是 当涉及 Visual C 6 时 我收到以下错误 我可以知道为什么 以及如何修复错误 但仍然使析构函数保持私有状态 class X public static X instance stat
  • Rails HABTM 设置、模型对象和 join_table 插入控制器设置

    我有以下设置 1 个产品有多个 Product types 许多 Product types 有 1 种类型 根据我对文档的理解 HABTM 关系 我的模型是 class Product lt ApplicationRecord has a
  • QWebEngineView 在 load() 或 page() 方法上崩溃

    我正在致力于将 Qt 5 5 QWebView 项目移植到 Qt 5 6 测试版 QWebEngine 我已经阅读了移植指南here https wiki qt io Porting from QtWebKit to QtWebEngine
  • 使用C#,如何获取我的机器是64位还是32位?

    我想使用 C 创建一个方法来返回我的机器是 64 位还是 32 位 有谁知道该怎么做吗 系统 环境 Is64BitOperatingSystem http msdn microsoft com en us library system en
  • 在 Django 模板中通过键访问字典

    我正在将字典从我的视图传递到模板 所以 key1 value1 key2 value2 传入并循环键 值对很好 但是我还没有找到从特定键直接在视图中访问的优雅解决方案 例如 key1 例如 bu json items key1 我可以使用一
  • 实体框架 - 有条件地包含相关实体

    我维护一个 API 根据对人员列表的请求 根据请求返回不同的结果集 例如 一些 API 客户端想要获取人员列表及其交互列表 其他 API 客户端则想要人员及其元数据列表 所有这些都可以在返回人员的 API 方法请求中指定 这似乎不起作用 u
  • 如何从父类函数访问子类中定义的常量?

    我从 php net 看到这个例子 但 c MY CONST 仅在 5 3
  • 比较 R 中的两个字符向量

    我有两个 ID 字符向量 我想比较这两个字符向量 特别是我对以下数字感兴趣 A和B各有多少个ID 有多少个ID在A中但不在B中 有多少个ID在B但不在A 我还想画维恩图 以下是一些可以尝试的基础知识 gt A c Dog Cat Mouse
  • 在同一行使用变量时的预自增运算符

    我相信我想做的事情可能是有效的 因为它在两种情况下都用逗号分隔 不是典型的作业 但我不确定并且搜索不会显示有关这两个的任何内容具体情况 在这两种情况下 我都使用变量作为两个并行数组的索引 int a 3 10 20 30 int b 3 2