【问题标题】:What does the operation c=a+++b mean?操作 c=a+++b 是什么意思?
【发布时间】:2011-11-21 01:19:17
【问题描述】:

下面的代码让我很困惑

int a=2,b=5,c;
c=a+++b;
printf("%d,%d,%d",a,b,c);

我预计输出是 3,5,8,主要是因为 a++ 表示 2 +1 等于 3,而 3 + 5 等于 8,所以我预计是 3,5,8。结果是3,5,7。有人可以解释为什么会这样吗?

【问题讨论】:

  • a++ 绝对不是指2+1。 :)
  • 这些只是书中的练习,但它们让我思考。我一直弄错了!所以它不是生产代码或任何东西
  • 除非您正在编写 C++ 解析器/编译器,否则您永远不必编写/考虑像 a+++b 这样的表达式,稍后阅读代码的人可以轻松地将其解释为 a + (++b),其计算结果为8. 空格和括号是免费的,在这种情况下会让每个人的生活更轻松。
  • @BlueRaja-DannyPflughoeft 从本质上讲,这并不是一个真正的最大咀嚼问题,它基本上是对后增量如何工作的误解,按照今天的标准,这基本上是题外话。

标签: c++ c visual-c++


【解决方案1】:

解析为c = a++ + ba++表示后自增,即取a的值计算a + b == 2 + 5后自增。

请,永远不要这样写代码。

【讨论】:

  • 那条规则说明它被解析为a++ + b,而不是a + ++b?分词器很贪心?
  • 我认为它必须是严格左关联的。
  • 原因是 C 和 C++ 的词法分析器在看到某些内容时会尝试匹配最大的字符串。这就是您没有将var 视为三个标记var 的原因。或者为什么您将>= 视为一个令牌而不是>=。这也是您在vector<vector<int>> 中看到>> 令牌导致解析错误的原因。因此,当词法分析器看到第一个加号时,它会尝试下一个字符,它认为它可以将两个字符都匹配为++,然后继续查看下一个+。因此,解析器看到a ++ + b
  • @Blagovest Buyukliev:对于 C,规则是 6.4 第 4 段:“如果输入流已被解析为预处理标记,直到给定字符,下一个预处理标记是最长的字符序列可以构成一个预处理令牌..."
  • 您关于标记化是“a ++ + b”的观点是正确的,但您声称增量发生在 a + b 计算之后是错误的。 C 和 C++ 语言没有指定在什么时间相对于加法计算增量。将其计算为“temp = a++”是完全合法的,然后是“temp + b”,在增量之后计算“a + b”的加法。请记住,表达式的观察到它们具有这些值的时刻序列是非常不同的分析。
【解决方案2】:

Maximal Munch Rule适用于这样的表达式,据此,表达式被解析为:

c = a++ + b;

也就是说,a 是后自增 (a++),因此 a 的当前值(后自增前)用于 +b 的操作。

【讨论】:

    【解决方案3】:

    a++ 是 post 递增的,即表达式取 a 的值,then 加 1。
    c = ++a + b 会如你所愿。

    【讨论】:

      【解决方案4】:

      这是一个糟糕的编程风格的例子。

      它非常难以阅读,但是它发布了增量 a,因此它将 a 的当前值与 b 相加,然后递增 a

      【讨论】:

        【解决方案5】:

        a++ 在表达式之后被计算。

        c = ++a + b;会给你你的想法。

        【讨论】:

          【解决方案6】:

          后自增运算符 a++ 在表达式中计算 a 的值后更改 a 的 tge 值。由于 a 的原始值为 2,这就是计算 c 的值;在评估 ++ 之后,a 的值会更改以反映新值。

          【讨论】:

            【解决方案7】:

            a++ + b ..它给出结果 7 并且在 a 的表达式值更新为 3 之后,因为后自增运算符

            【讨论】:

            • a++ + b 的计算结果为 7 而不是 5。请三思而后行。
            【解决方案8】:

            根据Longest Match 规则,它在编译器的词法分析阶段被解析为a++ + +b。因此产生的输出。

            【讨论】:

              【解决方案9】:

              这里 c= a+++b;表示 c= (a++) +b;即后增量。 在 a++ 中,更改将发生在打印 a、b 和 c 的下一步。 在 ++a 中,即前缀增量,更改将发生在同一步骤中,输出为 8。

              【讨论】:

                猜你喜欢
                • 2012-06-14
                • 1970-01-01
                • 2017-02-02
                • 2013-12-16
                • 1970-01-01
                • 2014-02-09
                • 2018-08-06
                • 1970-01-01
                • 2022-11-10
                相关资源
                最近更新 更多