[ ] - 运算符中的加法和增量表达式
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]
是数组的一个元素。
根据标准,以下两个表达式是未定义的行为吗?
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]
是数组的一个元素。