[] - 运算符中的加法和增量表达式

时间:2017-01-31 18:27:06

标签: c++ c++11 undefined-behavior iso

根据标准是以下两个表达式未定义的行为?

int a = 1, b = 1; 
int c[] = { 1, 2, 3, 4, 5 }; 

// Do the following expressions lead to Undefined Behavior ? 
c[a++]; // (1)  
c[a+b]; // (2) 

2 个答案:

答案 0 :(得分:5)

不,以他们目前的形式,他们不会导致不确定的行为。 可能担心的是没有序列点违规。

  • 如果c[a++];a的现有值用于索引,a作为副作用(后增量运算符)递增。
  • c[a+b];没有任何变量值被更改a+b是数组的有效索引。

答案 1 :(得分:1)

如果a或b或a和b的总和大于数组的大小,则可能会出现未定义的行为:

int a = 1, b = 1; 
int c[] = { 1, 2, 3, 4, 5 }; 

c[a++]; // (1)  a = 2
c[a+b]; // (2) a + b = 3

cout << c[a] << endl;   // 3
cout << c[a+b] << endl; // 4
cout << a << ", " << b << endl;

正如你所看到的那样,没有UB,因为c[a + b] = c[3]是数组的一个元素。