根据标准是以下两个表达式未定义的行为?
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)
答案 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]
是数组的一个元素。