2014-10-30 3 views
5
here is the code 

struct point_tag { 
     int x; 
     int y; 
}; 

typedef struct point_tag Point; 

int main(void) 
{ 
     Point pt[] = { {10,20}, {30, 40}, {50,60}}; 
     pt[0] = {100,200}; 
} 

Когда я сделать pt[0] = {100, 200}, компилятор продолжает жаловаться наПочему этот массив присваивания структуры не компилируется?

error:expected expression before '{' token

Я не реально получить, что, хотя. Не выражение перед оператором присваивания {токен (=)?

Я не понимаю, почему назначение было бы проблемой. значение в адресе pt относится к массиву Point. Я просто устанавливаю 0-й пункт в качестве новой точки, и я знаю, что назначение структуры в формате, например {100,200}, является законным, если элементы внутри этого массива являются просто полями.

ответ

6

Для задания, типаж значение для типа точки, чтобы сделать его compound literal:

pt[0] = (Point){100,200}; 

Live code с помощью GCC

Это эквивалентно

{ 
    Point temp = {100,200}; 
    pt[0] = temp; 
} 

P.S. Компонентный литерал недоступен в старом строгом компиляторе C89. Он доступен в GCC для C89 как расширение, а в C99-соединении - основной элемент.

+0

Есть ли причина, по которой вам не нужно это делать для {10,20}, {30,40} и {50,60}? Это меня подводит. Технически вы по-прежнему присваиваете эти значения значению по этим индексам в массиве – committedandroider

+2

Поскольку вышеуказанная конструкция доступна только для инициализации. В 'pt [0] = (Point) {100,200};' вы создаете временную «точку» и присваиваете ее «pt [0]». Вы должны сообщить компилятору, является ли '{100, 200}' '' Point' или 'int [2]' или что-то еще. –

+0

, но не может ли это быть подобной логикой в ​​том, что вы также создаете точку Temp {10,20} и сохраняете это как значение первого индекса в массиве? – committedandroider

Смежные вопросы