C++ 如何解决这个递增-递减运算符问题?

C++ 如何解决这个递增-递减运算符问题?,c++,operator-precedence,C++,Operator Precedence,这就是给定的问题。我在第3行中感到困惑,它说的是b++=++a+b++;。我只是想问一下,我们是在计算语句之前还是之后添加b?正确的输出是253。 请帮忙让我们一行一行地看 int a = 10; int b = 5; b += ++a + b++; a = a++ * ++b; cout << a; 这里我们将a设为10,b设为5 当您执行++a时,这意味着您正在立即增加a,以便将增加的值用于当前操作。当您使用b++时,这意味着操作后b将增加 在那一刻,你说的是b+=11+5;。

这就是给定的问题。我在第3行中感到困惑,它说的是b++=++a+b++;。我只是想问一下,我们是在计算语句之前还是之后添加b?正确的输出是253。
请帮忙

让我们一行一行地看

int a = 10;
int b = 5;
b += ++a + b++;
a = a++ * ++b;
cout << a;
这里我们将a设为10,b设为5

当您执行++a时,这意味着您正在立即增加a,以便将增加的值用于当前操作。当您使用b++时,这意味着操作后b将增加

在那一刻,你说的是b+=11+5;。11来自已增加的a,5是b的值,仅在操作结束后增加

b+=16将把b变成21,因为b以前是5。当操作结束时,由于b++,在b中增加1,结果是22

这里我们把a设为11,b设为22

想法是一样的,b会立即增加,所以我们有a=a*23,结果是253,因为a之前是11。在操作之后,我们应该在a中添加1,因为a++,但我们不会,因为我们正在为a设置一个新值,而旧值(将增加)不再存在

这里我们把a设为253,b设为23


输出253。

这些递增/递减运算符以以下方式工作:

i++返回i的当前值,然后将i增加1

++i将i增加1,然后返回i的新值

i-返回i的当前值,然后将i减1

-i将i减1,然后返回i的新值

因此,行b++=++a+b++首先递增a并返回a的新值,即11

现在我们有b++=11+b++。b的当前值是5,因此b++返回值5并将b增加1->b+=6+5


因此,b最终增加11+5+1或17,因此b最终等于22。最后,在这个语句后面有a=11和b=22。

赋值运算符+=的优先级在表达式中使用的其他运算符中最小。你可以检查整张桌子

此外,增量运算符的优先级高于加法运算符的优先级,因此它首先进行增量运算,即++a或++b,然后将它们相加。

有一些规则

必须检查每个运算符的关联性。 你必须一次接受尽可能多的匹配哨兵 为了简单起见,我将逐行解释

int a = 10;
int b = 5;
b += ++a + b++;
a = a++ * ++b;
cout << a;
int a=10;------变量a的初始化值为10 int b=5;------变量b用值5初始化 b++=+a+b++;------对于++a,变量a变为11,然后对于++a+b,11将与值b相加,它将变为16。然后b将以b++的值1递增,并变为6。最后,对于b+=*计算的_值*,最终b的值将与16相加,变成22=16+6。 a=a++*++b;------变量a将与递增的b相乘。意味着,第一个b将增加1b++并变为23,然后11和23将乘以a*++b并变为253。在那之后,a将增加,变成12a++。但这里是转折点,253将覆盖12,因为它将是这一行的最后一个执行哨兵。i、 e,在该行执行结束时,var a将等于253。
CUT< P>这是有问题的C++代码,根据GCC 10.1 < /P> $cat-n tmp.cpp | sed-r's/^*/;s/\t/' 1包括 2. 3无效函数 4 { 5 INTA=10; 6intb=5; 7 b++=+a+b++; 8 a=a++*++b;
9 std::cout简单地说,在c++17中,当RHS上有一个后增量运算符作用于LHS上的同一变量时,在应用任何相等运算符之前,先将增量应用于LHS

cout<<a;

答案取决于编译器使用的C++标准。在C++ 17之前,行为是未定义的;C++ 17解决了这个问题,因此在分配前完全可以对您的RHS进行评估。请看:解决方案很简单:不要分析只写代码是浪费时间。编写清晰、简洁的代码。ECHO @ PeteBecker。唯一正确的RES。ponse是这样的代码,永远不应该被编写。即使C++17完全定义了事情发生的顺序,也没有理由使用这个定义。三个答案,没有一个提到C++17标准或序列点。嗯。@AdrianMole:C++17已经成为标准多年了,我认为讨论遗留问题没有什么意义这个问题的C++版本。它实际上应该输出253。请看我的评论。“望远镜”——也许,取决于标准的版本。在C++ 17之前,行为是未定义的,所以任何关于它应该做的声明都是毫无意义的。错!使用标准的C++ 14的CLAN给出:警告G3255。41F5:对“a”进行了多个未排序的修改,这是:警告G325541F5:对“b”进行了多个未排序的修改。更准确地说,增量后表达式的结果是增量前的值。这并不能告诉您
例如,b=b++是如何工作的。在C++17之前,它的行为是未定义的。虽然这是真的,但它并没有告诉你b=b++的结果是什么。并且,通过扩展,b+=无论什么+b++。这不是优先的问题。在C++17之前,这两个表达式的行为都是未定义的。
a = a++ * ++b;
cout<<a;
int a = 10;
int b = 5;
b += ++a + b++; // 6 += 11 + 5   gives b = 22, a = 11
a = a++ * ++b;  // a(=12) = 11 * 23  gives 253 by overwriting the 12
cout << a;      // gives 253