我最近学习了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。 我认为我的是假的。所以我需要帮助。谢谢。
答案 0 :(得分:3)
*
的操作数相对于彼此未经测序。这意味着它们不仅可以按任何顺序进行评估;但如果每个操作数包含多个子步骤,则一个操作数的子步骤可能与另一个操作数的子步骤交错。
这方面的一个例子可能是(f() + g()) * (h() + i())
。可以按任何顺序调用这四个函数 - 不要求f
和g
一起调用等。
回到您的示例,以下两个子步骤相对于彼此未经过排序:
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;
}