2017-01-31 12 views
1

В соответствии со стандартом представлены следующие два выражения неопределенного поведения?Сложение и увеличение выражения в [] - оператор

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) 
+3

'a' не является массивом .... –

+0

' a [a ++]; 'is compiler error – NathanOliver

+0

Вы имели в виду' int c [] = {1, 2, 3, 4, 5}; '? –

ответ

5

Нет, в их нынешнем виде они не приводят к неопределенному поведению. Нет нарушения последовательности, поскольку вы могли опасались.

  • В случае c[a++]; существующее значение a используется в индексации, и a увеличивается в качестве побочного эффекта (оператора пост-инкремент).
  • c[a+b]; Ни одно из значений переменных изменено и a+b - действительный индекс массива.
+0

В стандартном разделе C++ 14 iso «1.9.15» есть пример, который приводит к путанице: http://www.open-std.org/jtc1/sc22/ wg21/docs/papers/2014/n4296.pdf Но могу ли я просто неправильно понять раздел. – SebNag

+0

@SebNag Этот пример использует результат 'v [i ++]' для изменения 'i', что дает две нечеловеческие модификации' i'. Btw, стандартом C++ 14 будет N4141 (+ - возможно, некоторые исправления опечатки/макета). N4296 - промежуточный проект. –

+0

@SebNag Это другой случай, там вы используете приращение post на 'i' __as, а as__ присваиваете значение RHS обратно' i'. Теперь нет точки последовательности между выполнением побочного эффекта и назначением, где лежит проблема. –

1

Вы можете получить неопределенное поведение, если а или б, или сумма а и Ь больше, чем размер массива:

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] который является элементом массива.