Перейти к публикации
  • Сейчас на странице   Всего пользователей: 1   (0 пользователей, 1 гость)

tik_crazy

Си

Рекомендованные сообщения

Гость ~Bob~

написано, читай внимательно:

If side effects appear in the arguments, that also would be a problem

Поделиться сообщением


Ссылка на сообщение

Все IBM PC компиляторы (Borland C в их числе) вычисляют аргументы функций справа налево, отсюда такой эффект. Кто хоть раз работал в их среде программирования знает об этом.

 

 


OFFICIAL ANTIKAKEL SQUAD LEADER 6f042ff1e9.png

Поделиться сообщением


Ссылка на сообщение

в обычной функции с ФИКСИРОВАННЫМ числом аргументов... в такой функции, как printf(const char*, ...) прототип определяет только один обязательный аргумент и список необязательных дополнительных аргументов. у такой функции вычисление дополнительных аргументов происходит в обратном порядке аналогично разворачиванию стека.

это не зависит от типа компилятора или платформы, зависимость только от алгоритма обработки дополнительных аргументов функции.

Поделиться сообщением


Ссылка на сообщение

в обычной функции с ФИКСИРОВАННЫМ числом аргументов... в такой функции, как printf(const char*, ...) прототип определяет только один обязательный аргумент и список необязательных дополнительных аргументов. у такой функции вычисление дополнительных аргументов происходит в обратном порядке аналогично разворачиванию стека.

это не зависит от типа компилятора или платформы, зависимость только от алгоритма обработки дополнительных аргументов функции.

зависит олол, не забыай что у тебя тут ещё инкрементирование происходит


OFFICIAL ANTIKAKEL SQUAD LEADER 6f042ff1e9.png

Поделиться сообщением


Ссылка на сообщение

проверял разные варианты

 

#include <stdio.h>
#include <conio.h>
int main ()
{
int i=0;
printf("%d %d",++i,i++);
getch();
return 0;
}

 

Выводит на экран "2 0". Из этого вывод, что сначала выводится второй агрумент, происходит пост-инкрементирование затем пре-инкрементирование первого аргумента и вывод первого.

 

А в изначальном коде после вывода первого аргумента происходит пост-инкрементирование (то есть если допиусать еще один вывод на экран переменной i, то выведет "2").

Поделиться сообщением


Ссылка на сообщение

лолблять сборищие индусов.

 

руки надо за такую хуйню отрывать


a8124c90781e.jpg


fdc85e1206e8.jpg

Поделиться сообщением


Ссылка на сообщение

лолблять сборищие индусов.

 

руки надо за такую хуйню отрывать

ты бы не выебывался и объяснил че да как

Поделиться сообщением


Ссылка на сообщение
пример:

 

main(){

  int i = 3;

  printf( "%d %d %d\n", i += 7, i++, i++ );

}

 

который показывает, что на IBM PC и PDP-11 аргументы функций вычисляются справа

налево (пример печатает 12 4 3). Впрочем, другие компиляторы могут вычислять их

слева направо (как и подсказывает нам здравый смысл).

 

 

при таком коде не определён порядок вычисления аргументов, т.е. вывод остаётся на совести компилятора

 

 


zenit2dx5.gif

Поделиться сообщением


Ссылка на сообщение

------- 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

тут не написано причины

а тебе что недостаточно слов что "порядок вычисления аргументов компилятором не может быть определен заранее"?

Поделиться сообщением


Ссылка на сообщение

объясните мне пжалуста на кой хер такое писать?

 

типа мания "наебашу код в одну строку"?


a8124c90781e.jpg


fdc85e1206e8.jpg

Поделиться сообщением


Ссылка на сообщение

Значит есть код

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 и сравни. :)

Поделиться сообщением


Ссылка на сообщение

объясните мне пжалуста на кой хер такое писать?

 

типа мания "наебашу код в одну строку"?

Просто разобраться в странном "поведении" компилятора на элементарном примере. А насчет мании "наебашу код в одну строку" тут этим и не пахнет, епт.

Поделиться сообщением


Ссылка на сообщение

объясните мне пжалуста на кой хер такое писать?

 

типа мания "наебашу код в одну строку"?

Просто разобраться в странном "поведении" компилятора на элементарном примере. А насчет мании "наебашу код в одну строку" тут этим и не пахнет, епт.

ну как показывает история оно не странное, а самое что ни на есть нормальное  :dunno:

Поделиться сообщением


Ссылка на сообщение
Просто разобраться в странном "поведении" компилятора на элементарном примере. А насчет мании "наебашу код в одну строку" тут этим и не пахнет, епт.

причина странного поведения компилятора - дурной код.

не пиши такого кода, компилятор не будет вести себя странно, в его странном поведении не придется разбираться.

 

все предельно просто епте.

 

когда ты передаешь параметр в ф-ю или допустим условие проверяешь не предполагается, вообще говоря, что ты будешь менять значение переменной.


a8124c90781e.jpg


fdc85e1206e8.jpg

Поделиться сообщением


Ссылка на сообщение

ёпт это всего лишь задание было на автомат)))

тока сука препод его не поставил

------- 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

тут не написано причины

а тебе что недостаточно слов что "порядок вычисления аргументов компилятором не может быть определен заранее"?

ответ в итоге правильный, не смог понять ибо в английском не шарю

Поделиться сообщением


Ссылка на сообщение

if(i++ || i++); - еще пример хорошего кода

 

а лучше вот так даже:

if(i++ && i++ && i++ && i++ && i++);

 


a8124c90781e.jpg


fdc85e1206e8.jpg

Поделиться сообщением


Ссылка на сообщение
а еще все переменные называть черточками разной длины
F{F{F <KZ

надо парсер написать который делает такой код чВ


a8124c90781e.jpg


fdc85e1206e8.jpg

Поделиться сообщением


Ссылка на сообщение

ЗИТА, ГИТА

МНЕ ТАК ПЛОХО, ЧТО ХОЧЕТСЯ ПЕ...ПРОГРАММИРОВАТЬ  :metal:

(с)


общество защиты прав злоупотребителей

Поделиться сообщением


Ссылка на сообщение

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Восстановить форматирование

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Загрузка...

×
×
  • Создать...