Гость ~Bob~ #21 13 ноября 2008 написано, читай внимательно: If side effects appear in the arguments, that also would be a problem Цитата Поделиться сообщением Ссылка на сообщение
zebn #22 14 ноября 2008 Все IBM PC компиляторы (Borland C в их числе) вычисляют аргументы функций справа налево, отсюда такой эффект. Кто хоть раз работал в их среде программирования знает об этом. Цитата OFFICIAL ANTIKAKEL SQUAD LEADER Поделиться сообщением Ссылка на сообщение
Nark #23 14 ноября 2008 в обычной функции с ФИКСИРОВАННЫМ числом аргументов... в такой функции, как printf(const char*, ...) прототип определяет только один обязательный аргумент и список необязательных дополнительных аргументов. у такой функции вычисление дополнительных аргументов происходит в обратном порядке аналогично разворачиванию стека. это не зависит от типа компилятора или платформы, зависимость только от алгоритма обработки дополнительных аргументов функции. Цитата Поделиться сообщением Ссылка на сообщение
zebn #24 14 ноября 2008 в обычной функции с ФИКСИРОВАННЫМ числом аргументов... в такой функции, как printf(const char*, ...) прототип определяет только один обязательный аргумент и список необязательных дополнительных аргументов. у такой функции вычисление дополнительных аргументов происходит в обратном порядке аналогично разворачиванию стека. это не зависит от типа компилятора или платформы, зависимость только от алгоритма обработки дополнительных аргументов функции. зависит олол, не забыай что у тебя тут ещё инкрементирование происходит Цитата OFFICIAL ANTIKAKEL SQUAD LEADER Поделиться сообщением Ссылка на сообщение
FY2 #25 15 ноября 2008 проверял разные варианты #include <stdio.h> #include <conio.h> int main () { int i=0; printf("%d %d",++i,i++); getch(); return 0; } Выводит на экран "2 0". Из этого вывод, что сначала выводится второй агрумент, происходит пост-инкрементирование затем пре-инкрементирование первого аргумента и вывод первого. А в изначальном коде после вывода первого аргумента происходит пост-инкрементирование (то есть если допиусать еще один вывод на экран переменной i, то выведет "2"). Цитата Поделиться сообщением Ссылка на сообщение
Druu #26 15 ноября 2008 лолблять сборищие индусов. руки надо за такую хуйню отрывать Цитата Поделиться сообщением Ссылка на сообщение
tik_crazy #27 15 ноября 2008 лолблять сборищие индусов. руки надо за такую хуйню отрывать ты бы не выебывался и объяснил че да как Цитата Поделиться сообщением Ссылка на сообщение
ganja_ #28 15 ноября 2008 пример: main(){ int i = 3; printf( "%d %d %d\n", i += 7, i++, i++ ); } который показывает, что на IBM PC и PDP-11 аргументы функций вычисляются справа налево (пример печатает 12 4 3). Впрочем, другие компиляторы могут вычислять их слева направо (как и подсказывает нам здравый смысл). при таком коде не определён порядок вычисления аргументов, т.е. вывод остаётся на совести компилятора Цитата Поделиться сообщением Ссылка на сообщение
XpoHuK #29 16 ноября 2008 ------- Additional Comments From ghazi at gcc dot gnu dot org 2005-06-09 13:01 ------- If side effects appear in the arguments, that also would be a problem, e.g.: printf("%d", i++); printf("%d", i++); should not be turned into: printf("%d%d", i++, i++); because we can't guarantee order of evaluation. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21982 ну у меня вопрос как раз поэтому почему выводится 1 0 , а не 0 1 тут не написано причины а тебе что недостаточно слов что "порядок вычисления аргументов компилятором не может быть определен заранее"? Цитата https://www.twitch.tv/alcorithm Поделиться сообщением Ссылка на сообщение
Druu #30 16 ноября 2008 объясните мне пжалуста на кой хер такое писать? типа мания "наебашу код в одну строку"? Цитата Поделиться сообщением Ссылка на сообщение
UnLiMiTeDBeeR #31 16 ноября 2008 Значит есть код printf("%d %d",i++,i++) Шарящие, объясните плиз, почему выводится на экран 1,0 Смотрим прототип функции printf, видим у него ключевое слово __cdecl (это для С++ Builder, но и, скажем, в Visual Studio оно, либо эквивалентное ему, тоже должно быть), читаем:cdecl Основной способ вызова для Си (отсюда название, сокращение от «c-declaration»). Параметры закладываются в стек в обратном порядке. Указатель стека на исходную позицию возвращает вызывающая программа. Аргументы функции также должны вычисляться в обратном порядке (справа налево) и затем помещаться в стек, иначе потребуется дополнительная память для хранения вычисленных значений. Таким образом, компилятор смотрит на порядок передачи аргументов в функцию (в данном случае справа налево) и в этом порядке начинает вычислять ее аргументы. Берет аргумент, который нужно передать первым (самый правый), вычисляет его (значение равно 0), заносит его в стек и увеличивает значение переменной на 1 (ибо постинкремент). Также он поступает со вторым аргументом с той лишь разницей, что начальное значение переменной в этом выражении равно 1. Вот тебе тестовая функция для демонстрации влияния порядка передачи агрументов: void __pascal TestFunc(int Arg1, int Arg2) { printf("%d %d", Arg1, Arg2); }Посмотри на ее вывод, а затем замени __pascal на __cdecl и сравни. :) Цитата Поделиться сообщением Ссылка на сообщение
FY2 #32 16 ноября 2008 объясните мне пжалуста на кой хер такое писать? типа мания "наебашу код в одну строку"? Просто разобраться в странном "поведении" компилятора на элементарном примере. А насчет мании "наебашу код в одну строку" тут этим и не пахнет, епт. Цитата Поделиться сообщением Ссылка на сообщение
XpoHuK #33 16 ноября 2008 объясните мне пжалуста на кой хер такое писать? типа мания "наебашу код в одну строку"? Просто разобраться в странном "поведении" компилятора на элементарном примере. А насчет мании "наебашу код в одну строку" тут этим и не пахнет, епт. ну как показывает история оно не странное, а самое что ни на есть нормальное Цитата https://www.twitch.tv/alcorithm Поделиться сообщением Ссылка на сообщение
Druu #34 16 ноября 2008 Просто разобраться в странном "поведении" компилятора на элементарном примере. А насчет мании "наебашу код в одну строку" тут этим и не пахнет, епт. причина странного поведения компилятора - дурной код. не пиши такого кода, компилятор не будет вести себя странно, в его странном поведении не придется разбираться. все предельно просто епте. когда ты передаешь параметр в ф-ю или допустим условие проверяешь не предполагается, вообще говоря, что ты будешь менять значение переменной. Цитата Поделиться сообщением Ссылка на сообщение
tik_crazy #35 19 ноября 2008 ёпт это всего лишь задание было на автомат))) тока сука препод его не поставил ------- Additional Comments From ghazi at gcc dot gnu dot org 2005-06-09 13:01 ------- If side effects appear in the arguments, that also would be a problem, e.g.: printf("%d", i++); printf("%d", i++); should not be turned into: printf("%d%d", i++, i++); because we can't guarantee order of evaluation. http://gcc.gnu.org/bugzilla/show_bug.cgi?id=21982 ну у меня вопрос как раз поэтому почему выводится 1 0 , а не 0 1 тут не написано причины а тебе что недостаточно слов что "порядок вычисления аргументов компилятором не может быть определен заранее"? ответ в итоге правильный, не смог понять ибо в английском не шарю Цитата Поделиться сообщением Ссылка на сообщение
Druu #36 20 ноября 2008 if(i++ || i++); - еще пример хорошего кода а лучше вот так даже: if(i++ && i++ && i++ && i++ && i++); Цитата Поделиться сообщением Ссылка на сообщение
Vizakenjack #37 20 ноября 2008 а еще все переменные называть черточками разной длины Цитата Канал про крипту Поделиться сообщением Ссылка на сообщение
Druu #38 20 ноября 2008 а еще все переменные называть черточками разной длиныF{F{F <KZ надо парсер написать который делает такой код чВ Цитата Поделиться сообщением Ссылка на сообщение
dENIM #39 20 ноября 2008 ЗИТА, ГИТА МНЕ ТАК ПЛОХО, ЧТО ХОЧЕТСЯ ПЕ...ПРОГРАММИРОВАТЬ (с) Цитата общество защиты прав злоупотребителей Поделиться сообщением Ссылка на сообщение
Vizakenjack #40 20 ноября 2008 дадад у меня тоже такая идея :D Цитата Канал про крипту Поделиться сообщением Ссылка на сообщение