Каков побочный эффект следующего макроса в C?Встроенный C - PullRequest
5 голосов
/ 04 сентября 2011
#define MIN(A,B) ((A) <=  (B) ? (A) : (B))

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

least = MIN(*p++, b);

Примечание: это был встроенный вопрос c

Ответы [ 4 ]

7 голосов
/ 04 сентября 2011

Макрос расширится до:

least = ((*p++)<=(b)?(*p++):(b))

тогда в вашем утверждении будет *p++ дважды (т.е. оно будет увеличено вдвое).

7 голосов
/ 04 сентября 2011

Оценивает p++ дважды.Кроме того, поскольку первая оценка изменяется p, во второй раз около она будет указывать на другой элемент .Таким образом, возвращаемое значение будет *(initialp + 1) или b.

. Попробуйте сами.

2 голосов
/ 04 сентября 2011

*p++ оценивается дважды при расширении макроса до *p++ <= b ? *p++ : b

Также не существует такой вещи, как «встроенный C».

1 голос
/ 04 июня 2018

Предположим, что начальный адрес p = 0xfcf0, * p = 1, b = 2, значение @ 0xfcf4 = 5 и значение @ 0xfcf8 = 15

Макрос будет расширяться как

наименьший = ((* p ++) <= (b)? (* P ++): (b)); </p>

т.е. минимум = ((1) <= (2)? (* P ++): (b)); </p>

, поскольку * p увеличивается в два раза.

1) * p ++ -> теперь p будет указывать на адрес 0xfcf4;

2) * p ++ -> теперь p будет указывать на адрес 0xfcf8;

Так минимум = 15; (значения в адресе 0xfcf8). Надеюсь, это поможет.

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