a = (a + b) - (b = a); C++ 与 PHP

2023-12-02

我环顾四周,发现了公式:a = (a + b) - (b = a)它应该交换两个变量(或某些情况下的对象)。然而我用 C++ 和 php 测试了它,这些给了我不同的结果。

php:

$a = 10;
$b = 20;
$a = ($a + $b) - ($b = $a);
echo $a, " ", $b;

这打印20 10

C++

int a = 10;
int b = 20;
a = (a + b) - (b = a);
std::cout << a << " " << b;

这打印10 10

代码看起来相同但输出不同,我一直在思考两个原因:

  1. C++ 代码正在编译,php 正在解释。
  2. 这个公式没有用,因为它会导致未定义的行为。

有人可以解释一下,为什么 C++ 和 php 输出在这种情况下不同?


我不确定 PHP 中的规则是什么,但在 C++ 中,各个子表达式的顺序没有严格定义,或者用技术术语来说,它是“未指定的”——换句话说,编译器是允许的计算b = a之前或之后a + b。只要它做到了a + b and b = a减法之前。使用“未指定”行为允许编译器在某些情况下生成更有效的代码,或者简单地说可以为某些体系结构构建编译器。

这还意味着,如果您有一个表达式“重新计算”表达式本身内的值,并且也在表达式的其他位置使用它,则会出现未定义的行为(简称 UB)。 UB 的意思就是,行为没有定义 - 几乎任何事情都可能发生,包括你所看到的和许多其他替代方案(例如,编译器也被允许生成 42 作为结果,即使逻辑表明答案不会是42 在这种情况下[这是一个错误的问题!])。

我还建议如果你想在 PHP 中交换两个值:

 $t = $a;
 $a = $b;
 $b = $t;

在 C++ 中:

 #include <algorithm>

 std::swap(a, b); 

或者如果您坚持自己编写:

 int t = a;
 a = b;
 b = t; 

尝试聪明地“不使用临时变量”执行它几乎肯定会比使用临时变量慢 - 当然在像 C++ 这样的编译语言中 - 在像 PHP 这样的解释语言中,创建一个新变量可能会增加一点额外的开销,但与所需的逻辑上的额外工作相比,它不太可能那么大。

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

a = (a + b) - (b = a); C++ 与 PHP 的相关文章

  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • PHP 数组通过 JSON 转为 jquery 数组

    我有点困惑为什么以下不起作用 get php
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 从支付网关重定向回时用户会话丢失

    我已将 Cyber source 配置为我的支付网关 我能够导航到 cybersource 并进行付款 并能够成功重定向回该网站 我也可以取消付款并重定向回我的网站 我收到来自支付网关的响应 但是 用户在从支付网关重定向回来时会被注销 我正
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 为什么 isnormal() 说一个值是正常的,而实际上不是?

    include
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • Laravel $request->file() 返回 null

    尝试在后端使用 Laravel 上传文件时遇到问题 Issue Laravel request gt file 方法返回 null Setup 我使用以下方法构建了一个 AJAX 请求超级代理人 https github com visio
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern
  • 为什么我的会话仍然存在?

    我一定很愚蠢 因为似乎一件相当明显的事情现在让我完全困惑 我有一个会议 ie SESSION handbag id 在某个时刻 我需要彻底终止这个会话 ie at the start of the page session start el
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 如何使用 GDK 检查 Google Glass 是否连接到互联网

    有没有办法在运行时检测 Google Glass 是否连接到互联网 例如 在我的应用程序中使用语音输入时 我经常收到 现在无法联系 Google 的消息 相反 我想先发制人地拦截会导致该消息的条件并使用默认值而不是要求语音输入 经过一段时间
  • 从 R 中的数字中删除逗号

    我的数字有 表示 1 000 及以上 R 将其视为因子 我想将两个这样的变量从因子切换为数字 实际上这两个变量都是数字 但出于某种原因 R 将它们视为因子 数据是从 Excel 导入的 更改因子变量mydata x1对于数字变量 我使用以下
  • java 中更好的 Html Builder [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想要低于输出 table tbody thead Blah Blah table Header Constant Part thead tr so
  • 单击按钮时反应获取数据

    我正在尝试在反应中获取数据 问题是我必须单击按钮两次才能获取该数据 虽然我在第一次单击时没有获取数据 但如果我向其中添加 JSON stringify 它会以某种方式呈现 如果我不添加 JSON stringify 它会返回未定义 如果有人
  • 依赖属性上的 XAML 绑定

    我目前正在开发 WPF TimePicker 控件 该控件继承了一个 TextBox 它有一个 MaskedTexProvider 它以以下格式显示 TimeSpan HH MM 到目前为止 一切都按预期工作 向上和向下箭头更改基础 Tim
  • 在 RecyclerView 中发布 ExoPlayer

    我正在 RecyclerView 中实现 ExoPlayer 但滚动时视频会停止 但音频不会停止 如何在RecyclerView中释放ExoPlayer 或者我怎样才能获得回收对象的位置 以便我能够释放 ExoPlayer 这是我的数据对象
  • System.Data.Entity.DbContext 找不到添加为引用

    当我去构建我的项目时 我收到此错误 类型 System Data Entity DbContext 是在未引用的程序集中定义的 您必须添加对程序集 EntityFramework Version 5 0 0 0 Culture neutra
  • 如何更改 Oracle 中视图的列大小

    我正在尝试使用与表相同的命令来更改视图的列大小 例如 alter table STUDENT modify ROLL NO VARCHAR2 80 但它的抛出错误 SQL 错误 ORA 00942 表或视图不存在 那么我们如何改变视图的列大
  • 注册到活动的 Google 发布商代码

    我查看了 Google 发布商代码参考 并决定可以向我的广告位添加一些事件 如果我只定义了一个插槽 它会非常有效 如果我添加更多插槽 事件会在我的控制台上不断重复我有插槽的次数 所以 如果我做这样的事情
  • 如何使用 javascript 展开和折叠

    我在我的网站上创建了一个列表 该列表是由 foreach 循环创建的 该循环使用我的数据库中的信息构建 每个项目都是一个包含不同部分的容器 因此这不是像 1 2 3 等这样的列表 我列出了带有信息的重复部分 每个部分都有一个小节 一般构建如
  • C++ 大数算术

    我正在开发一个用于大数算术的类 它现在知道如何进行加法 处理 cin 和 cout 然而 它的减法功能非常有限且基本 并且不知道如何处理负数 但这很容易解决 我的问题是 如何进行乘法运算 我将在这里详细介绍它如何处理 cin 和 cout
  • 将本地 Sourcetree 存储库恢复为 master

    我是 Sourcetree 的新手 在本地造成了混乱 与 origin master 相比 有 7 个提前提交 我想忽略并删除我在本地完成的所有操作 然后通过将本地存储库恢复到当前的 origin master 来重新开始 我该怎么做呢 R
  • DIV 汇编的错误答案

    我有我的代码的一部分 mov di 3 mov cx 16 looop xor dx dx shl bx 1 adc dx dx cmp cx 16 je cx16 it s will dec cx and jump loop push d
  • 更改 ggplot 因子颜色

    我注意到这里盒须图电话 p geom boxplot aes fill factor cyl 为箱线图填充生成明亮的红色 绿色 蓝色 同时 p geom boxplot aes fill factor vs 产生独特的浅绿色 红色 在我的数
  • 如何获取链接到耶拿资源的资源列表?

    我使用 Jena API 创建了一个模型 public static void main String args Model model ModelFactory createDefaultModel Resource alice Reso
  • iOS - 从后台自动打开应用程序

    是否可以以某种方式从后台模式重新打开应用程序 例如 如果后台应用程序正在检查服务器中的某些标志 然后触发时 它会自动转到前台吗 如果没有 我可以显示一条消息并播放声音以供用户请求重新打开应用程序吗 例如 WhatsApp 如何实现这一目标
  • C#中有指数运算符吗?

    例如 是否存在可以处理此问题的操作员 float Result Number1 Number2 Number1 2 Number2 2 Result Number1 operator Number2 过去的 运算符在其他语言中充当指数运算符
  • 如何在 Jenkins 中为工件添加时间戳

    我关注了 Jenkisfile 并且正在尝试上传带有时间戳的工件 import groovy transform Field Field def timeStamp Calendar getInstance getTime format Y
  • python 中的 SpeechRecogniton 模块太慢

    我试图对我的深度学习聊天机器人使用语音识别来获取用户的输入 实际上我的语音识别功能代码是这样的 def get audio r sr Recognizer with sr Microphone as source r pause thres
  • a = (a + b) - (b = a); C++ 与 PHP

    我环顾四周 发现了公式 a a b b a 它应该交换两个变量 或某些情况下的对象 然而我用 C 和 php 测试了它 这些给了我不同的结果 php a 10 b 20 a a b b a echo a b 这打印20 10 C int a