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中的这个变化!