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

Addition and Increment expression in [ ] - operator

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

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) 

不,以目前的形式,它们不会导致未定义的行为。没有您可能担心的序列点违规。

  • c[a++]; 的情况下,a 的现有值用于索引,并且 a 作为副作用(post-increment 运算符)递增。
  • c[a+b]; none 的变量值被 改变 并且 a+b 是数组的有效索引。

如果 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] 是数组的一个元素。