порядок вызова аргументов функции
От: Аноним  
Дата: 09.04.07 13:15
Оценка:
Всем привет!

Сейчас с удивлением обнаружил, что аргументы функции вызываются в обратном порядке. Т.е. в примере:
С(A(),B());

сначала вызовется в B, а затем A, а не наоборот. Это везде так или только в моем msvc8?

Еще, если пользоваться конструкциями типа:
if(b && func()){...};
if(b || func()){...};

то при ложном b функция гарантированно не вызывается в первой строке, а при истинном — во второй. На это можно полагаться?
Re: порядок вызова аргументов функции
От: Stuw  
Дата: 09.04.07 13:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем привет!


А>Сейчас с удивлением обнаружил, что аргументы функции вызываются в обратном порядке. Т.е. в примере:

А>
А>С(A(),B());
А>

А>сначала вызовется в B, а затем A, а не наоборот. Это везде так или только в моем msvc8?

Порядок вызова аргументов функции зависит от компилятора.


А>Еще, если пользоваться конструкциями типа:

А>
А>if(b && func()){...};
А>if(b || func()){...};
А>

А>то при ложном b функция гарантированно не вызывается в первой строке, а при истинном — во второй. На это можно полагаться?


Да
Re[2]: порядок вызова аргументов функции
От: Smal Россия  
Дата: 09.04.07 13:21
Оценка: 1 (1)
Здравствуйте, Stuw, Вы писали:

S>Здравствуйте, Аноним, Вы писали:


А>>Всем привет!


А>>Сейчас с удивлением обнаружил, что аргументы функции вызываются в обратном порядке. Т.е. в примере:

А>>
А>>С(A(),B());
А>>

А>>сначала вызовется в B, а затем A, а не наоборот. Это везде так или только в моем msvc8?

S>Порядок вызова аргументов функции зависит от компилятора.



А>>Еще, если пользоваться конструкциями типа:

А>>
А>>if(b && func()){...};
А>>if(b || func()){...};
А>>

А>>то при ложном b функция гарантированно не вызывается в первой строке, а при истинном — во второй. На это можно полагаться?


S>Да

Если только операторы && и || не перегружены.
С уважением, Александр
Re[2]: порядок вызова аргументов функции
От: Аноним  
Дата: 09.04.07 13:23
Оценка:
Здравствуйте, Stuw, Вы писали:

S>Порядок вызова аргументов функции зависит от компилятора.


А в каких компиляторах он прямой?
Re[3]: порядок вызова аргументов функции
От: SergH Россия  
Дата: 09.04.07 13:26
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А в каких компиляторах он прямой?


Лучше на такое не полагаться. Компилятор не обязан соблюдать какой-то один порядок вычисления аргументов.
Делай что должно, и будь что будет
Re[3]: порядок вызова аргументов функции
От: Smal Россия  
Дата: 09.04.07 13:27
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Stuw, Вы писали:


S>>Порядок вызова аргументов функции зависит от компилятора.


А>А в каких компиляторах он прямой?


Зависит от компилятора — значит компилятор решает каждый раз так, как ему в этом конкретном случае удобно.
Просто стандарт не гарантирует никакого порядка => поведение в твоем случае не определено.
С уважением, Александр
Re: порядок вызова аргументов функции
От: IROV..  
Дата: 09.04.07 13:29
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем привет!


А>Сейчас с удивлением обнаружил, что аргументы функции вызываются в обратном порядке. Т.е. в примере:

А>
А>С(A(),B());
А>

А>сначала вызовется в B, а затем A, а не наоборот. Это везде так или только в моем msvc8?

Для разруливания данной ситуации я на уровне codestyle запретил данные конструкции ( никогда не писать функции в параметрах функций )
Также этот пункт способствует облегчению дебага

А>Еще, если пользоваться конструкциями типа:

А>
А>if(b && func()){...};
А>if(b || func()){...};
А>

А>то при ложном b функция гарантированно не вызывается в первой строке, а при истинном — во второй. На это можно полагаться?
Да, если не перегружены.
И еще могу добавить что компиляторы могут давать возможность что func() не выполнится вообще: в первом случаии если b == false во втором если b == true
я не волшебник, я только учусь!
Re[2]: порядок вызова аргументов функции
От: IROV..  
Дата: 09.04.07 13:30
Оценка:
Здравствуйте, IROV.., Вы писали:
IRO>И еще могу добавить что компиляторы могут давать возможность что func() не выполнится вообще: в первом случаии если b == false во втором если b == true
Блин хотел сказать что эту опцию можно выключать
я не волшебник, я только учусь!
Re: порядок вызова аргументов функции
От: wilddony  
Дата: 09.04.07 13:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем привет!


А>Сейчас с удивлением обнаружил, что аргументы функции вызываются в обратном порядке. Т.е. в примере:

А>
А>С(A(),B());
А>

А>сначала вызовется в B, а затем A, а не наоборот. Это везде так или только в моем msvc8?

А>Еще, если пользоваться конструкциями типа:

А>
А>if(b && func()){...};
А>if(b || func()){...};
А>

А>то при ложном b функция гарантированно не вызывается в первой строке, а при истинном — во второй. На это можно полагаться?

Порядок передачи аргументов в функцию зависит от модели вызова.
Argument Passing and Naming Conventions
Re[3]: порядок вызова аргументов функции
От: Кодт Россия  
Дата: 09.04.07 13:51
Оценка:
Здравствуйте, <Аноним>, Вы писали:

S>>Порядок вызова аргументов функции зависит от компилятора.


А>А в каких компиляторах он прямой?


Не "в каких компиляторах", а "в каких условиях". Например, в релизной сборке со включённой оптимизацией.
Ключевое слово — unspecified behavior.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: порядок вызова аргументов функции
От: Programador  
Дата: 09.04.07 13:52
Оценка:
Здравствуйте, wilddony, Вы писали:

W>Порядок передачи аргументов в функцию зависит от модели вызова.

Если модель не стековая то какбы сказать.. порядок не упорядочен. Тоесть об порядке можно говорить только при наличии стека. С другой стороны порядок вычислений может не совподать с порядком передачи. Микрософт не гарантирует прядка
Re[2]: порядок вызова аргументов функции
От: Константин Л.  
Дата: 09.04.07 13:58
Оценка:
Здравствуйте, wilddony, Вы писали:

[]

W>Порядок передачи аргументов в функцию зависит от модели вызова.

W>Argument Passing and Naming Conventions

passing отличается от calculating. Так вот в стандарте порядок calculating — не определен.
Re[3]: порядок вызова аргументов функции
От: demi США  
Дата: 09.04.07 14:52
Оценка:
Здравствуйте, Programador, Вы писали:

P>Здравствуйте, wilddony, Вы писали:


W>>Порядок передачи аргументов в функцию зависит от модели вызова.

P>Если модель не стековая то какбы сказать.. порядок не упорядочен. Тоесть об порядке можно говорить только при наличии стека. С другой стороны порядок вычислений может не совподать с порядком передачи. Микрософт не гарантирует порядка
А нам с этим беспорядком работай потом Улыбнуло!
Не стыдно попасть в дерьмо, стыдно в нём остаться!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.