C-код для замены двух целых чисел путем передачи указателей на функцию подкачки - PullRequest
2 голосов
/ 03 ноября 2011

Я столкнулся с этой проблемой при решении практического теста

Рассмотрим этот код C, чтобы поменять местами два целых числа, и эти пять операторов:

void swap (int *px, int *py) {

*px = *px – *py;

*py = *px + *py;

*px = *py – *px;

}

S1: приведет к ошибке компиляции

S2: может генерировать ошибку сегментации во время выполнения в зависимости от переданных аргументов

S3: правильно реализует процедуру подстановки для всех указателей ввода, относящихся к целым числам, хранящимся в ячейках памяти, доступных для процесса

S4: правильно реализует процедуру обмена для некоторых, но не для всех допустимых входных указателей

S5: может добавлять или вычитать целые числа и указатели.

Какие из приведенных выше утверждений являются правильными?

Я думаю S2 и S3.Может кто-нибудь, пожалуйста, подтвердите

Ответы [ 4 ]

3 голосов
/ 03 ноября 2011

Я не верю, что S3 выполняется, так как если вы вызовете его с помощью px == py, он просто установит целое число в первой строке в 0 (*px = *px - *py будет эквивалентно *px = *px - *px, который, очевидно, хранит 0 в*px).Когда все входные данные установлены в 0, невозможно восстановить и заново сгенерировать значение.

2 голосов
/ 03 ноября 2011
S1: False, the code will compile
S2: True, never checks for NULL
S3: False, as unwind pointed out, if px == py it would fail
S4: True for the case cited above
S5: False, never subtracts any pointers

edit: я ошибся, сказав, что код не поменяется местами:)

1 голос
/ 03 ноября 2011

Вы очень близки, но знаете, что переполнение целых чисел (со знаком) приводит к неопределенному поведению.Это может немного изменить ваши ответы.

0 голосов
/ 03 ноября 2011
  • S2 верно.
  • S4 имеет значение true, поскольку S3 имеет значение false из-за проблемы наложения имен.
  • Остальное ложно

Без проблем с псевдонимами это действительно поменяет значения:

px | пи
-------------------------------------------------- -----------------------------
px: = px-py |
| py: = px + py => px-py + py = px
px: = py-px => px- (px-py) = py |

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