2013-07-31 5 views
5

Я смущен тем, как этот код будет выполнен. Предположим, что у нас естьразница между * y ++ и ++ * y?

int x=30,*y,*z; 
y=&x; 

В чем разница между * y ++ и ++ * y? а также какой будет выход этой программы?

#include<stdio.h> 
int main(){ 

    int x=30,*y,*z; 
    y=&x; 
    z=y; 
    *y++=*z++; 
    x++; 
    printf("%d %d %d ",x,y,z); 
    return 0; 
} 
+1

Подумайте о '++ * y' и' * ++ y'. –

+0

Я вижу, что вы имеете дело с указателями, но это может помочь: http://stackoverflow.com/questions/1094872/is-there-a-difference-between-x-and-x-in-java – zztops

+1

Разве вы не можете просто * запустить *, что программа находит свой выход? (Хорошо, если вы исправите его, чтобы не иметь неопределенного поведения сначала ...) –

ответ

8

Выражение x = *y++ в эффектах же, как:

x = *y; 
y = y + 1; 

И если выражение просто *y++; (без назначения), то его ничего, кроме такого же, как y++;, то есть y начало, указывая на следующую локацию после приращение.

Второе выражение ++*y означает для увеличения значения, на который указывает y, что так же, как: *y = *y + 1; (указатель не увеличивается) Это будет лучше понятно, с ответом на ваш первый вопрос:

Предположим, что ваш код:

int x = 30, *y; 
int temp; 
y = &x; 

temp = *y++; //this is same as: temp = *y; y = y + 1; 

Первый *y будет присваиваться переменной temp; следовательно, temp присвоен 30, тогда значение y увеличивается на единицу, и оно начинается с следующего места после местоположения x (где действительно нет переменной).

Следующий случай: Предположим, что ваш код:

int x = 30, *y; 
int temp; 
y = &x; 

temp = ++*y; //this is same as *y = *y + 1; temp = *y; 

Первое значение *y приращений от 30 до 31, а затем 31 присваивается temp (примечание: x теперь 31).

Следующая часть Вашего вопроса (читать комментарии):

int x = 30, *y, *z; 

y = &x;  // y ---> x , y points to x 
z = y;  // z ---> x , z points to x 
*y++ = *z++; // *y = *z, y++, z++ , that is 
       // x = x, y++, z++ 
x++;   // increment x to 31 
5

чем разница между * у ++ и ++ * у?

В случае выражения *y++ и *z++; потому что постфиксная версия ++ имеет приоритет над *, компилятор видит это как;

*(y++) = *(z++); 

В случае ++*y; компилятор видит это как ++(*p), и он сначала увеличит значение объекта, на который он указывает (x в этом случае), а затем возвращает его добавочное значение.

Сводная таблица для других возможностей;

Expression     Meaning 
------------------------------------------------------------------------------------- 
*y++ or *(y++)   Value of expression is *y before increment; increment y latter 
(*y)++     Value of expression is *y before increment; increment *t later 
*++y or *(++y)   Increment y first; value of expression is *y after increment 
++*y or ++(*y)   Increment *y first; value of expression is *y after increment 

EDIT: Как отметил Eric Lippert в своем комментарии, что говоря: значение выражения *y, прежде чем приращение, приращение у позже вводит в заблуждение, я хочу пояснить здесь, что слова I используется последнего и после подчеркнуть, что предыдущего или следующего значение *y, соответственно, будут использоваться в выражениях.
Обратите внимание, что побочный эффект может быть произведен в любом порядке, сначала производят побочный эффект, а значение назначается последним, а значение назначено первым, а побочный эффект - последним. Для более подробной информации читайте ответы: - 1, 2 от Eric Lippert.

+0

сначала удалить горизонтальный прокрутки .. –

+0

Вы думаете '* y ++' == '* (y ++) '**? ** –

+0

Да. Верно. – haccks

1

Я надеюсь, что вы понимаете, что означают операторы ++ и * при использовании отдельно. При совместном использовании вступает в игру приоритет оператора. В C++ оператор ++ имеет более высокий приоритет, чем оператор *. Таким образом, эффективно *y++ означает *(y++) и ++y* средства (++y)*. Надеюсь, это поможет.

+1

В SO есть ошибка. Я написал «* (y ++)» и могу ясно видеть его, когда я перехожу к редактированию, но пока он отображает только «(y ++)». –

+0

Не ошибка: прочитайте: http://stackoverflow.com/editing-help –

+0

Это не ошибка. '*' имеет специальный редактор. Прочтите этот вопрос. Я отредактировал, чтобы было ясно ... И добро пожаловать в SO. –

6

В чем разница между *y++ и ++*y?

Смысл выражения в C характеризуется двумя вещами: что значение она производит и какие побочные эффекты она производит.

Давайте рассмотрим первое выражение.

Постфикс приращения имеет более высокий приоритет, чем разыменование, поэтому это *(y++).

Постфикс приращения создает побочный эффект: он изменяет значение y, чтобы указать на другое место. Приращение постфикса также создает значение: значение, которое y имело до того, как оно было увеличено. Оператор * затем разделяет это значение для получения значения lvalue: то есть вы можете использовать его как переменную, либо для хранения, либо для извлечения.

Отмечу, что побочный эффект может произойти в любой момент до или после разыменования. Если вы сказали

q = *y++ 

то побочный эффект ++ может произойти в любой момент. Это может быть:

q = *y; 
y = y + 1; 

или его можно рассматривать как

t = y; 
y = y + 1; 
q = *t; 

Оба совершенно законно. (За исключением, конечно, что если y сам по себе является выражением с побочными эффектами, эти побочные эффекты должны создаваться только один раз. Для ясности я сделаю это предположение повсюду.)

Как насчет ++*y? Это просто: *y создает переменную, содержимое переменной увеличивается, а значение выражения - приращение. Обратите внимание, что опять же, побочный эффект может быть получен испорченный:

q = ++*y 

можно рассматривать как:

t = *y + 1; 
*y = t; 
q = t; 

или

t = *y + 1; 
q = t; 
*y = t; 

Помните, что C не производят очень много ограничений на порядок, в котором могут возникать побочные эффекты, поэтому будьте осторожны.

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