2015-08-22 3 views
-4
int main() 
{ 
    struct data{ 
     int a; 
     int b; 
    }y[4] = {1,10,3,30,2,20,4,40}; 

    struct data *x = y; 
    int i; 

    for(i = 0; i < 4; i++) 
    { 
     x->a = x->b, ++x++ ->b; 
     printf("%d%d\t", y[i].a, y[i].b); 
    } 


    return 0; 
} 

Как работает этот код?Что означает x-> a = x-> b, ++ x ++ -> b; делать в данной программе?

+1

Не меняйте вопрос после получения ответов и комментариев. И не делайте вопрос широким. '->' - это оператор ссылочной структуры (Google для получения дополнительной информации), а '= {...}' инициализирует все элементы массива со значениями в списке инициализаторов. Поиграйте с ним на некоторое время, и вы получите это :-) –

+0

уверен, спасибо :), –

+0

Никакой профессиональный программист или энтузиаст не заботится, потому что весь такой код - мусор, как и этот вопрос. –

ответ

4

Заявление

x->a = x->b, ++x++ ->b; //note the comma operator after x->a = x->b 

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

x->a = x->b;  // Assign member `a` to first member of element of array y 
++((x++) ->b); // Fetch the member b of element of array y and then increment 
       // it by 1. Increment `x` by 1 after `b` is fetched. 
4

The ++x++ хорошо определено в этом контексте:

++x++->b 

, что эквивалентно:

++((x++)->b) 

Это означает, что два разных значения x и x->blvalues ​​ увеличиваются, а не единичные (это будет UB). Вы можете переписать его на два заявления:

++(x->b); 
x++; 

Полное выражение заявление:

x->a = x->b, ++x++ ->b; 

действует, так как существует точка последовательности (из-за оператора запятая) после того, как x->a = x->b оценивается (были не побочные эффекты в этом, поэтому результат этого подвыражения был отброшен) .

1

Это выражение

x->a = x->b, ++x++ ->b; 

использует оператор запятой и на самом деле для ясности могут быть разделены на два заявления

x->a = x->b; 
++x++ ->b; 

Второй Подвыражение можно представить следующим образом

struct data *temp = x; 
++x; 
++temp->b; 

, то есть он увеличивает член данных b структуры poin ted to by pointer x и увеличивает сам указатель.

Таким образом, элемент данных b текущей структуры (объект типа данных структуры) увеличивается, и указатель указывает на следующую структуру.

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