复合赋值(乘)

时间:2017-03-19 13:23:37

标签: c++

我最近学习了C ++的基础知识。我找到了一些我没有理解的东西。这个程序让我有些困惑。

       #include <iostream>

    using namespace std;

    int main() 
    {
            int m = 4, n;
            n=++m*--m;
            cout <<"m="<<m<<" and n="<<n<<"\n;
            return 0;
    }

输出为m = 4且n = 16。     我以为     m = 4,所以++ m是5,-m将是4,     然后n = 5 * 4 = 20。     因此,m = 4且n = 20。     我认为我的是假的。所以我需要帮助。谢谢。

4 个答案:

答案 0 :(得分:3)

*的操作数相对于彼此未经测序。这意味着它们不仅可以按任何顺序进行评估;但如果每个操作数包含多个子步骤,则一个操作数的子步骤可能与另一个操作数的子步骤交错。

这方面的一个例子可能是(f() + g()) * (h() + i())。可以按任何顺序调用这四个函数 - 不要求fg一起调用等。

回到您的示例,以下两个子步骤相对于彼此未经过排序:

  • 将新值写入m,作为++m
  • 的一部分
  • 阅读m,作为--m
  • 的一部分

当对同一个变量有两个未经测序的操作(并且其中至少有一个是写入)时,它是undefined behaviour,这意味着任何事情都可能发生(包括意外的结果)。

答案 1 :(得分:1)

此:

n=++m*--m;

是错误的代码。用明确的东西替换它,例如:

n = (m + 1) * (m - 1);

由于复杂的原因,原始代码可能无法达到您的预期,因此最好不要首先编写此类代码。如果您想了解更多关于原因的详细信息,请参阅此处:Undefined behavior and sequence points

答案 2 :(得分:0)

++m表示“递增m然后使用其值”当前调用以(m + 1)作为值。 m--表示“使用m的值,然后递减它”当前调用具有原始值m,后续调用将具有(m - 1)作为值

如果这样可以让你更清楚,你也可以将其重写为:

int m = 4, n;
n = (m = (m + 1)) * (m = (m - 1));

答案 3 :(得分:0)

我非常肯定操作发生在增量之前。这就是为什么会这样。如果你这样打破它,它应该工作。

答案应该是15因为4 + 1是5而4-3是3,因此5 * 3是15.见下文

    int main()
{
    int m = 4, n;
    int g;
    n = (m+1) * (m-1);
    std::cout << "m=" << m << " and n=" << n << "\n" ;
    std::cin >> g;
    return 0;
}