C++索引评估方向

Thi*_*Dam 3 c++

请考虑以下代码: argv[1][2]

C++如何处理索引评估?例如从左到右:[1]在[2]之前,从右到左进行评估:[2]在[1]之前进行评估,还是取决于所使用的编译器?

asc*_*ler 10

严格来说,有很多评估正在进行中argv[1][2](相当于(argv[1])[2])

  1. 评估 argv
  2. 评估 1
  3. 评估 2
  4. 评估 argv[1]
  5. 评估 argv[1][2]

如果不知道操作符的值是什么,就不能真正地计算运算符表达式,因此#1和#2必须在#4之前发生,而#3和#4必须在#5之前发生.

当然,"评价1"并没有多大意义,因为它只是一个字面上的已知值.但是如果表达式是相似的argv[f1()][f2()],那么子表达式评估的顺序可能很重要.

在C++高达C++ 14版本中,它是在未指定argv[f1()][f2()]是否f1()f2()首先被调用.C++ 17在子表达式的顺序上引入了许多额外的保证,包括数组下标的规则:in A[B],所有的子表达式的评估和副作用A现在都发生在子表达式的所有评估和副作用之前B.所以C++ 17保证在这种情况下f1()将被调用f2().