2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




На страницу Пред.  1, 2, 3
 
 Re: Наблюдение за префиксным инкрементом
Сообщение28.03.2022, 18:50 
Аватара пользователя

(Оффтоп)

Vladimir-80 в сообщении #1551223 писал(а):
Интересно, почему молчит автор темы? Наверняка он, затевая беседу, имел какие-то мысли по этому поводу.

Так мне викой в лицо ткнули вот и молчу :-)

 
 
 
 Re: Наблюдение за префиксным инкрементом
Сообщение28.03.2022, 21:09 
Аватара пользователя
zykov в сообщении #1551268 писал(а):
Что-то смотрю в документации и не вижу спецификации например для "a+b", в каком порядке "a" и "b" оцениваются.
Потому что её там нет - вычисление подывражений unsequenced (6.5.3).

 
 
 
 Re: Наблюдение за префиксным инкрементом
Сообщение29.03.2022, 06:12 
Ну да, тут не отличается от любого вызова функции "func(a, b);", где порядок оценки аргументов может быть произвольный.
Тут только функция "operator+(a,b);".

 
 
 
 Re: Наблюдение за префиксным инкрементом
Сообщение02.04.2022, 05:36 
Аватара пользователя
zykov в сообщении #1551268 писал(а):
mihaild в сообщении #1551265 писал(а):
Нет, ассоциативность - это как расставлять скобки
Да, верно.
Что-то смотрю в документации и не вижу спецификации например для "a+b", в каком порядке "a" и "b" оцениваются. Что важно при изобилии side effects.


Ключевым моментом тут является не то, что порядок не оговаривается, а то, что никакого порядка вообще не сущестывует. Неоговоренный порядок (indeterminately sequenced evaluation) и отсутствие порядка (unsequenced evaluation) - это соврешенно разные вещи.

В выражении `a+b` подвыражения `a` и `b` являются unsequenced и в С, и в С++, то есть неупорядочены вообще никак. Они могут фактически вычисляться параллельно, перемешанно и одновременно. По этой причине ни о каком `++i + ++i` в С и С++ не может быть и речи, ни со скобками, ни без скобок, ни вообще никак.

Vladimir-80 в сообщении #1551223 писал(а):
Интересно, почему молчит автор темы? Наверняка он, затевая беседу, имел какие-то мысли по этому поводу.


Возможно потому что именно этот вопрос в С и С++ форумах - популярный торололо вброс чуть ли не с Лурка. Скорее всего именно с этим мы и имеем дело в данном случае.

-- 01.04.2022, 18:42 --

zykov в сообщении #1551314 писал(а):
Ну да, тут не отличается от любого вызова функции "func(a, b);", где порядок оценки аргументов может быть произвольный.
Тут только функция "operator+(a,b);".


Такая аналогия справедлива только в С, где вычисление аргументов функции тоже точно так же unsequenced, то есть может выполняться паралелльно/одновременно/перемешанно для всех аргументов.

Для С++ такая аналогия грубейше не верна. Порядок вычисления аргументов функции в С++ является indeterminately sequenced, то есть все аргументы должны вычисляться изолированно в каком-то произвольном порядке.

Например

Используется синтаксис C++
int foo(int a, int b)
{
  return a + b;
}

int i = 1;
int r = foo(++i, ++i);
 

В языке С++ поведение определено и функция гарантированно возвращает 5. (Низкокачественные компиляторы, вроде GCC, пока не добрались до этой гарантии С++17)
В языке С поведение не определено, никто ничего не вычисляет и никуда не возвращает, код в общем случае - некомпилируем.

 
 
 [ Сообщений: 34 ]  На страницу Пред.  1, 2, 3


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group