Intereting Posts
литье, а затем указатели разыменования в C C – индекс, применяемый к указателю на указатель Функция Variadic (va_arg) не работает с float, а printf делает? В чем разница? Учитывая начальный и конечный индексы, как я могу скопировать часть строки в C? Как передать нулевой символ в аргументе командной строки в C? ld: 1 дублирующий символ для архитектуры x86_64 Программа C бесконечно бесконечно после того, как scanf получает неожиданные данные Распечатки перед execl не отображаются на выходе C fread () магически читает динамически распределенные члены структуры, как? Руководство по созданию собственной библиотеки для разработки cocoa (touch) файловая операция в двоичном и текстовом режимах – проблема производительности Объявление правильных переменных в c Почему double в C выравнивается по 8 байт? макрозависимый макрос Сортировка массива с использованием нескольких критериев сортировки (QuickSort)

Это неопределенное поведение в C / C ++

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

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

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

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

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

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

EDIT: Как указывает Прасун, поведение неуказано из- за порядка оценки … не указано. , и становится неопределенным из- за предшествующего значения, должен быть доступен только для определения значения, которое необходимо сохранить

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

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

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

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

Хорошо определено следующее.

 c = foo(a-1) + a ; 

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

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

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