Область действия функции и увеличивающиеся параметры - PullRequest
2 голосов
/ 09 мая 2011

Пример проблемы требует от нас рассмотрения приведенного ниже кода и прогнозирования того, что будет распечатано функцией funct_1:

void func_1(int i, int j) {
    printf("i is %d, j is %d\n", i, j);
}
/*   ...   */
/* somewhere in the code, a call to func_1 */
int i = 30;
func_1(i, i++);
/*   ...   */

Я думал, что когда параметры передаются в такой форме, где они увеличиваются, невозможно предсказать, когда компилятор увеличит i. Решение, однако, это:

The values in the argument are passed as an attack to the function, hence 'j' receives 
a value '30' and then i receives the incremented value which is '31'.

Output: i is 31, j is 30

Может кто-нибудь объяснить, что такое атака на функцию и как это происходит?

Ответы [ 2 ]

3 голосов
/ 09 мая 2011

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

1 голос
/ 09 мая 2011

В общем, решение неверное.Ты прав;Поведение кода не определено.На некоторых компиляторах ответ может быть 30 и 31;на других это может быть 30 и 30;на других это может быть 31 и 31;а другие могут просто стереть все файлы на вашем жестком диске (поскольку неопределенное поведение не определено).К счастью, радикальное поведение «убрать все следы проблемы» в компиляторе относительно маловероятно.

Для определенного компилятора на определенной платформе решение, вероятно, является правильным.


На самом деле, я думаю, что невозможно получить 31 для j в func_1() - но последовательность операций, которая выдает 30 и 30, легко представить: значение i толкается дважды, затем яувеличивается, затем вызывается функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...