输出奇怪,不符合预期

2023-12-21

很抱歉问你一个愚蠢的问题,但我就是不明白为什么我一直得到这个输出。 所以这是我的代码:

#include <cstdio>
#include <iostream>

using namespace std;
unsigned n = 4242;

int getRemainderOf(int m, int n, int& quotient);

static int l = 0;   
int main()
{

    int quotient;  // the value of which should be changed after calling the func.

    for(int i=-1; i<=1; ++i)
    {
        for(int j=-1; j<=1; ++j)
        {
            if( i && j )
            {

                cout << "("<< i*3 << "," << j*7 << ") "  <<( getRemainderOf(i*3, 7*j, quotient) ) << " " << quotient <<endl;

                cout << "("<< i*7 << "," << j*3 << ") "  << getRemainderOf(i*7, 3*j, quotient) << " "; cout << quotient <<endl;
            }
        }
    }

    return 0;
}

int getRemainderOf(int m, int n, int& quotient)
{
    ++l;
    cout << l <<endl;
    quotient = m / n;
    cout << " quotient " << quotient <<endl;
    return m % n;
}

所以我期望在输出的第一行中看到的是余数,然后是调用函数 getRemainderOf() 后得到的商。但是,当我像这样计算商的值时,我发现商的值是一个垃圾值。因此,即使我使用引用将变量的值传递给函数,变量的值也不会更改。 有趣的是,如果我分别计算余数(通过调用函数获得)和商,我就会得到正确的结果。 我发现问题可能在于将函数作为运算符


您刚刚发现的是 C++ 怪癖之一的经典示例。您的程序实际上可以分解为这个简单的示例:

int i = 10;
f(i, ++i);

编译器可以选择从左到右对函数参数求值,但这并不能保证。这是一些标准文本:

5.2/4 后缀表达式 [expr.post]

当调用函数时,每个参数都应使用其相应的实参进行初始化。 [Note:这种初始化彼此之间的顺序是不确定的 (1.9) -end note]

因为它们的顺序不确定,所以编译器可以自由地评估++i在第一个参数之前并用相应的函数参数初始化它,然后评估i接下来用其各自的参数初始化它。

函数调用参数求值歧义在这里适用的原因是operator<<()是一个函数,但它只是用运算符语法调用。例如,如果我们使用operator-id语法,您的代码如下所示:

std::operator<<(std::operator<<(std::operator<<(std::cout, "(").operator<<(i*3), ",").operator<<(j*7), ")").operator<<(getRemainderOf(i*3, 7*j, quotient)).operator<<(quotient);

这些只是带有参数的函数调用链,它们遵循与上面相同的规则。

解决方案是对修改对象并在应用中使用它的行为进行排序operator<<()称呼。您已经通过分区实现了这一点operator<<()用分号调用两个语句;,因此该函数保证在之前被调用quotient被打印。

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

输出奇怪,不符合预期 的相关文章

随机推荐

  • Scikit Learn 中的多变量/多元线性回归?

    我的 csv 文件中有一个数据集 数据 Train csv 和数据 Test csv 格式如下 Temperature K Pressure ATM CompressibilityFactor Z 273 1 24 675 0 806677
  • 实时图像处理(OCR)[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我打算开发一个像这样的应用程序字镜头 https itunes apple com in app wor
  • 保持窗口看起来活跃

    我正在为辅助监视器开发任务栏 我让它运行得相当好 我还可以使用空气动力学模糊外观 但我的问题可能与航空方面的东西无关 我想要做的是让我的任务栏窗口始终显示为焦点 激活状态 它不需要真正聚焦或激活 我只是希望它看起来像那样 您只需在应用程序空
  • 类型“CFStringRef”不符合 Xcode 6.1 中的协议“Hashable”

    在我的应用程序中 我有一个在 Xcode 6 中工作的钥匙串访问类 但现在在 Xcode 6 1 中我收到一些错误 这是第一个错误 类型 CFStringRef 不符合协议 Hashable private class func updat
  • Solr Atomic Update - 使用已索引但未存储的字段更新文档

    我有一个核心 其中包含一些已索引但未存储的字段的文档 我们将其称为 A 组字段 当我更新其他字段 已索引和存储 我们将其称为 B 组字段 时 A 组字段的内容会丢失 在此 Solr 文档中 更新部分文档 https cwiki apache
  • JMeter - 如何在 IF 控制器中使用多个条件?

    这是我的代码 In If Controller gt Condition Default Javascript I am providing following responsecode 404 responsecode 500 respo
  • 检测我的应用程序是否被卸载

    是否可以有一个代码来检测我的应用程序是否已被卸载 并且卸载后 我的应用程序创建的所有相关文件夹将被自动删除 Thanks 至于能够检测卸载 恐怕是不可能的 每当应用程序包被删除 App is Uninstalled 时 ACTION PAC
  • 什么语言或方法允许图形和音乐演示适合 64kb EXE?

    怎么可能在一个64kb编译后的exe 这些程序可以生成如此疯狂的视觉效果 并配有匹配的音乐 一个例子 Ars Nova 由 幻影领主 http www scene org file php id 581018 演示运行的 YouTube 视
  • QueryDSL 生成的类无法访问第二级元素进行查询

    我在 Java 项目中使用 QueryDSL 和 Spring Data JPA 并使用 QueryDSL maven 插件生成文件来使用它生成的 QueryDSL 模型类 当我将它用于一级嵌套对象时 这非常有用 但是如果我尝试访问第二级访
  • 如何使用powershell获取所有证书?

    我正在尝试使用 powershell 获取所有证书 当我将 computer My 设置为下面的存储位置时 脚本会返回我认为的用户证书 当我设置 computer root 时 它返回根证书 如何同时获得用户证书和机器证书 computer
  • Spring Tool Suite(STS版本3.6.1)没有创建Roo项目的选项

    STS 3 6 1 中似乎没有创建 Roo 应用程序的选项 在谷歌搜索时我注意到this https stackoverflow com questions 23365784 how to add spring roo on spring
  • 建议的基于 Hadoop 的设计/组件用于定期 REST API 调用的摄取

    我们计划使用 REST API 调用从端点提取数据并将数据存储到 HDFS REST 调用以定期方式 每天或每小时 完成 我已经使用 Flume 完成了 Twitter 摄取 但我认为使用 Flume 不适合我当前的用例 因为我没有使用像
  • OutputCache 使用 PostBack 返回无效版本

    我在输出缓存方面遇到了一个奇怪的问题 我在一个页面上有多个用户控件 其中一个是登录控件 页面和登录控件不会被缓存 但其他用户控件会使用 VaryByParam 进行缓存 现在 当我点击不同的页面时 所有这些都与缓存一起工作 但一旦我登录 该
  • C#:爬虫项目

    我可以很容易地遵循以下代码示例吗 使用浏览器控件向目标网站发起请求 捕获来自目标网站的响应 将响应转换为 DOM 对象 迭代 DOM 对象并捕获 FirstName LastName 等内容 如果它们是响应的一部分 thanks 以下代码使
  • 如何不将属性与 JSON 数据绑定

    这是我的模型 public sealed class UserModel Key Required StringLength 20 MinimumLength 4 public string Username get set Require
  • Jquery.validate - 一页 - 多个表单,一个提交正常,其他不提交

    在我的页面上 我有 3 个完整的表单 每个表单都有自己的提交按钮 每个表单和按钮都有不同的 id
  • 在浏览器中查看 JSON 文件

    这不是一个编程问题 但需要您三言两语表达自己的看法 当我们在浏览器中点击 JSON url 时 它会要求我们保存文件 为什么会出现这种情况 有什么办法可以在页面本身上查看它吗 是否有任何插件可用于在浏览器中查看 JSON 文件 在 Chro
  • 如何用js或jquery使小图像从屏幕的一侧移动到另一侧?

    我有一个小型动画飞机 上面写着 欢迎来到该网站 我希望它从左屏幕循环移动到右屏幕 刚出来 然后就消失了 现在 我知道这可以用 JS 完成 但我不知道 在JS中移动一张图片是不是很困难 在 的帮助下 animate https api jqu
  • 除了函数之外的任何类型的 Typescript 泛型类型

    structuredClone or lodash cloneDeep无法克隆函数 有没有办法从泛型中排除函数类型 I tried object Exclude
  • 输出奇怪,不符合预期

    很抱歉问你一个愚蠢的问题 但我就是不明白为什么我一直得到这个输出 所以这是我的代码 include