2012-08-15 5 views
1

Моя программа приведена ниже:я не могу понять, вывод этой программы

#include<stdio.h> 
main() 
{ 
    int x=30,*y,*z; 
    y=&x; 
    z=y; 
    *y++=*z++; //what does this mean? 
    x++;   
    printf("%d %d",y,z); 
    return 0; 
} 

Каков смысл этого утверждения: *y++=*z++?

+0

'y' и' z' оба указывают на 'x', поэтому вы присваиваете' x' себе. Затем вы увеличиваете оба указателя. Затем вы вызываете неопределенное поведение, передавая их в 'printf', но используя преобразование'% d', которое ожидает 'int', а не указатели (для печати указателей, их приведение в 'void *' и конвертирование с '% p'). –

+0

@JerryCoffin Я ржавый по этому поводу: это законно даже для того, чтобы заставить их указывать за пределы выделенного пространства? – cnicutar

+4

@cnicutar: Да. Указание одного конца конца массива разрешено до тех пор, пока вы не разыщите указатель и (C99, §6.5.6/7): «Для целей этих операторов указатель на объект, который не является элемент массива ведет себя так же, как указатель на первый элемент массива длиной один с типом объекта в качестве его типа элемента. " –

ответ

3

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

*y = *z; 
y++; 
z++; 

Я не могу понять, вывод этой программы

Вы печати указатели, там не так много, чтобы понять.


  • Вы должны использовать %p вместо %d при печати указателей
  • вы двигаетесь за пределами вселенной, когда вы увеличиваете эти указатели
0

Это то же самое, как:

*y = *z; 
++z; 
++y; 
0

Это просто присваивает значение объекта poi nted к y к объекту, на который указывает z, затем увеличивает оба указателя.

0

Он просто назначит значение объекта, на которое указывает y, по отношению к объекту, на которое указывает z, и, наконец, увеличивает оба указателя.

3

y и z являются указателями, а выражения y++ и z++ используют операторы постфиксных, поэтому оба приращения будет после задания.

Это утверждение делает 3 вещи:

  1. сопоставляет значение, на которое указывает y то же значение, на которое указывает z: *y = *z.
  2. Увеличивает указатель y. Теперь y указывает на следующийint в памяти.
  3. Увеличивает указатель z. Теперь z указывает на следующийint в памяти.

Последние два были бы плохо, если бы y и z были использованы после того, как заявление: y и z теперь указывают на неинициализированного памяти, которая не принадлежит к коду.

+0

Оператор постфикса имеет более высокий приоритет, чем *. Так что, не увеличивайте сначала указатель z, а затем разыщите его? – Ram

+0

Извините, я получил это. эффект постфиксного оператора ощущается только после выполнения инструкции. чувствую себя немым сейчас !!! – Ram

0

Переменные y и z являются указателями на целые числа и в этом случае указывают на адрес переменной x.

Следующие строки устанавливают значение y по адресу x (т.е.&x дает вам адрес `x '.

y=&x; 
z=y 

Следующая строка, *y++=*z++; точно не имеет смысла и может быть или может не компилироваться в зависимости от используемого компилятора. В случае GCC 4.3.2 он дает следующую ошибку.

foo.c:7: error: invalid operands to binary * (have ‘int *’ and ‘int *’) 

Похоже, что вы пытаетесь сделать арифметику указателей, но получил приоритет оператора немного перепутали. Вы пытаетесь увеличить значение, указанное z после присвоения значения предварительного приращения местоположению?

+0

Вы получаете эту ошибку, потому что пропустили точку с запятой для оператора «z = y» – Ram

1

*y++=*z++; - Это просто присвоение значений, хранящихся в указателе z, *y. После этого увеличивается и указатель y, и z. После этого заявления разыменование как z, так и y может привести к сбою (неопределенное поведение).

Такого рода заявление, используемое при осуществлении строки копирования

void my_strcpy(char *dest, char* src) 
{ 
    while((*dest++ = *src++)); 
} 
0
*y++=*z++; //wat does this mean? 

Приведенные выше результаты в неопределенном поведении (нескольких модификаций до следующей точки последовательности).

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