2016-11-25 14 views
0

Я читал о некоторых вопросах stackoverflow, которые отправляют или предварительно увеличивают переменную в вызове функции, могут привести к неопределенному поведению.Является ли доступ к элементу массива с использованием пост-инкрементированной переменной неопределенного поведения в C++?

Поскольку в векторе оператор доступа к элементу массива, operator[]() является вызовом функции, то же самое верно для следующего примера кода?

double p_step = 1.0/(double)_progress_bar_chars.size(); 
int ixx = 0; 
for(double p = 0.0; p < 1.0; p += p_step) 
    _progress_bar_chars[ixx ++] = (p <= progress ? '=' : ' '); 

Приведенный выше код вызывает неопределенное поведение?

Для справки:

std::vector<char> _progress_bar_chars; 
_progress_bar_chars.resize(50); 
double progress = 0.5; 

Наконец, делает это независимо от того, что я использую зЬй :: вектор здесь, а не в чистом массиве или куче выделяется массив?

+0

использовать его как это не приведет к непредсказуемому поведению, может быть, [эта страница] (HTTP: //en.cppreference. com/w/cpp/language/eval_order) может помочь вам больше –

+0

Поскольку '_progress_bar_chars [ixx ++]' совпадает с '_progress_bar_chars.operator [] (ixx ++)' Я бы сказал, что это вопрос, возможно дубликат http://stackoverflow.com/questions/598148/is-it-legal-to-use-the-increment-operator-in-ac-function-call –

ответ

3

Проблема возникает, когда приращение и ту же переменную дважды, например:

foo(i++, i++); 

В этом случае, второй не определен

При использовании оператора [] не существует неопределенное поведение.

Для получения дополнительной информации: Is it legal to use the increment operator in a C++ function call?

+1

В частности, не определено, какие аргументы функции порядка будут оцениваться, поэтому любой аргумент, имеющий «побочные эффекты», потенциально опасен. –

+1

@SvenNilsson: задано 'foo ((* f1()) ++, ((* f2()) ++)' операции внутри f1() не могут чередоваться с любыми другими операциями, а также операции внутри f2() но последовательности reads-modify-write на адресах, возвращаемых этими функциями, могут быть чередующимися в проблемном порядке. Если две вещи в списке аргументов для одного и того же вызова функции оба увеличены, поведение будет определено только в том случае, если они не пересекаются. код может ссылаться на носовых демонов. – supercat

1

Использование до или после приращения не влияет на достоверность кода.

Важно только то, что полученный показатель в зоне для вектора или массива