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

Addition and Increment expression in [ ] - operator

本文关键字:表达式 运算符      更新时间:2023-10-16

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

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作为(后增量运算符的)副作用递增。
  • c[a+b]; 不会更改任何变量值,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]数组的一个元素。