C++ 下标在赋值运算符的右侧之前求值吗

C++ 下标在赋值运算符的右侧之前求值吗,c++,c++11,C++,C++11,我正试着做类似的事情 arr[getchar()-'a']=getchar() 是否保证此处的下标的求值优先于其他任何东西?不,不保证。(至少对于C++17之前的代码,) 根据规则(我的重点): 任何表达式任何部分的求值顺序,包括 函数参数的求值未指定[…]。 编译器可以计算操作数和其他值 子表达式的任何顺序,并且在 再次计算相同的表达式。 中没有从左到右或从右到左求值的概念 C++。这不能与从左到右和从右到左混淆 运算符的关联性:解析表达式a()+b()+c() 由于运算符+从左到右的关联性,

我正试着做类似的事情

arr[getchar()-'a']=getchar()


是否保证此处的下标的求值优先于其他任何东西?

不,不保证。(至少对于C++17之前的代码,)

根据规则(我的重点):

任何表达式任何部分的求值顺序,包括 函数参数的求值未指定[…]。 编译器可以计算操作数和其他值 子表达式的任何顺序,并且在 再次计算相同的表达式。

中没有从左到右或从右到左求值的概念 C++。这不能与从左到右和从右到左混淆 运算符的关联性:解析表达式a()+b()+c() 由于运算符+从左到右的关联性,将其设为(a()+b())+c(), 但是,对c的函数调用可以在第一次、最后一次或两次之间求值 运行时的a()或b()


我引用C++引用,但是.< /P> < P> <强>不,它没有保证。(至少对于C++ 17代码)。

根据规则(我的重点):

任何表达式任何部分的求值顺序,包括 函数参数的求值未指定[…]。 编译器可以计算操作数和其他值 子表达式的任何顺序,并且在 再次计算相同的表达式。

中没有从左到右或从右到左求值的概念 C++。这不能与从左到右和从右到左混淆 运算符的关联性:解析表达式a()+b()+c() 由于运算符+从左到右的关联性,将其设为(a()+b())+c(), 但是,对c的函数调用可以在第一次、最后一次或两次之间求值 运行时的a()或b()


<引用C++引用,但是<>在C++ 17之前,没有保证< < /P> > C++17:(自)

17) 在下标表达式E1[E2]中,E1的每个值计算和副作用在E2的每个值计算和副作用之前排序

20) 在每个简单赋值表达式E1=E2和每个复合赋值表达式E1@=E2中,E2的每个值计算和副作用都是在E1的每个值计算和副作用之前排序的

因此,在你的情况下:

   arr[getchar()-'a'] = getchar();
// (2)  (3)              (1)

在C++17之前,没有订单保证

C++17:(自)

17) 在下标表达式E1[E2]中,E1的每个值计算和副作用在E2的每个值计算和副作用之前排序

20) 在每个简单赋值表达式E1=E2和每个复合赋值表达式E1@=E2中,E2的每个值计算和副作用都是在E1的每个值计算和副作用之前排序的

因此,在你的情况下:

   arr[getchar()-'a'] = getchar();
// (2)  (3)              (1)

也许可以考虑做
char c=getchar();arr[c-'a']=c避免混淆?@FedericoklezCulloca您的版本与原始版本有不同的含义,
getchar
应该调用两次。哪种语言?哪个标准?[OT]:
'a'..'z'
不保证是连续的,因此
getchar()-'a'
不可移植。在C++17中,保证
=
的RHS在LHS之前排序,因此索引
getchar()
是第二个调用。在C或C++17之前的版本中没有这样的规则;arr[c-'a']=c避免混淆?@FedericoklezCulloca您的版本与原始版本有不同的含义,
getchar
应该调用两次。哪种语言?哪个标准?[OT]:
'a'..'z'
不保证是连续的,因此
getchar()-'a'
不可移植。在C++17中,保证
=
的RHS在LHS之前排序,因此索引
getchar()
是第二个调用。在C或C++17之前的版本中没有这样的规则。规则20说,
=
有一个顺序,因为C++17.C++17看到了对某些表达式引入的排序的一些更改。这个特定表达式的答案的准确性取决于OP对标准的选择。@StoryTeller和mch:谢谢注意,我不知道C++17的更新规则-每天学习。。。规则20说,
=
有一个顺序,因为C++17.C++17看到了对某些表达式引入的排序的一些更改。对于该特定表达式,此答案的准确性取决于OP对标准的选择。@StoryTeller和mch:谢谢注意,我不知道C++17的更新规则-每天学习…我更新了我的答案并参考了你的答案以避免冗余:-)好的观点,不知道C++17-+1中的此更改!我更新了我的答案,并参考了你的答案,以避免冗余:-)很好,我不知道C++17-+1中的这个变化!