Это неопределенное поведение в C / C ++ - PullRequest
4 голосов
/ 22 марта 2011
int foo(int c){
    return c;
}

int main(void){
    int a=5,c;
    c = foo(--a) + a; 
}

Будет ли вызывать неопределенное поведение в C / C ++? Я думаю, что нет, не будет.

После прочтения всех ответов я не могу понять, является ли это неопределенным поведением или неопределенным поведением.

Ответы [ 5 ]

16 голосов
/ 22 марта 2011

Да, это неопределенное поведение - a и foo(--a) могут оцениваться в любом порядке.

Для получения дополнительной информации см., Например, Точка последовательности .Существует точка последовательности после полного выражения и после вычисления аргумента до foo - но порядок вычисления подвыражений не определен, для 5/4:

За исключением отмеченных случаев, порядокоценки операндов отдельных операторов и подвыражений отдельных выражений, а также порядка, в котором происходят побочные эффекты, не определены.Между предыдущей и следующей точкой последовательности скалярному объекту должно быть изменено его сохраненное значение не более одного раза путем оценки выражения.Кроме того, предварительное значение должно быть доступно только для определения значения, которое будет сохранено.Требования этого параграфа должны выполняться для каждого допустимого порядка подвыражений полного выражения;в противном случае поведение не определено.

РЕДАКТИРОВАТЬ: Как указывает Прасун, поведение не указано из-за порядок оценки ... не указан. и становится неопределенным из-за к предыдущему значению должен быть получен доступ только для определения значения, которое будет сохранено

5 голосов
/ 22 марта 2011

Вы должны прочитать это , это скажет вам, что ваш код не определен, потому что + не является точкой последовательности и, следовательно, не определено, будет ли f(--a) или a оценена первой.

3 голосов
/ 22 марта 2011

Несмотря на то, что операнды оператора + могут оцениваться в любом порядке, поведение не определено, поскольку оно нарушает 2-е правило

1) Между предыдущей и следующей точкой последовательности объект должен иметь свое сохраненное значениеизменено не более одного раза путем оценки выражения.

2) Кроме того, к предыдущему значению следует обращаться только для определения значения, которое будет сохранено .

Ниже четко определены

c = foo(a-1) + a ;

Прочитайте эту запись FAQ для лучшего понимания неопределенного поведения и точек последовательности.

2 голосов
/ 22 марта 2011

Согласно Википедии + является , а не точкой последовательности, поэтому порядок оценки не фиксирован, следовательно, у вас неопределенное поведение.

0 голосов
/ 22 марта 2011

Вы получите предупреждение о типе возвращаемого значения в основной функции, иначе все в порядке и c = 8 в конце main ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...