#c #assign
#c #назначить
Вопрос:
У меня есть небольшой сегмент кода на C, который меня немного смущает.
int *p, *q, arr[4]={5,8,3,7}
p = q = arr;
Означает ли присвоение указателя оба p
и q
равно arr
? Или это p
равно q
тому, что равно arr
? Это некоторое время не давало мне покоя, любая помощь приветствуется
Комментарии:
1. Тестовая программа длиной менее 10 строк может решить это за вас, и вы запомните это намного лучше, чем кто-то, кормящий вас с ложечки ответом.
2. Попробуйте
printf (" p: %pn q: %pn", p, q);
выполнить присвоение.
Ответ №1:
Оператор присваивания ( =
) является правильным ассоциативным. Это означает
a = b = c;
анализирует как
a = (b = c);
То есть, значение c
присваивается b
, а результирующее значение этой операции присваивания присваивается a
.
=
Оператор определен так, чтобы возвращать присвоенное значение, так что это эффективно устанавливает оба a
и b
в c
.
Ответ №2:
p
и q
оба в конечном итоге указывают на arr
(или, более правильно amp;arr[0]
, это имеет значение в более сложных сценариях). Оба способа выражения эквивалентны при работе с семантикой значений, как и в случае со значениями указателей в C.
В более общем плане, в C =
оператор выдает в качестве своего значения значение, присвоенное его левому операнду, так что вы можете связывать назначения любого типа, который может быть назначен.