Присвоение двум указателям одновременно в C

#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 = оператор выдает в качестве своего значения значение, присвоенное его левому операнду, так что вы можете связывать назначения любого типа, который может быть назначен.