2013-05-10 4 views
-6

В чем смысл следующей строки в C. Каков порядок ее выполнения?Приращение в обе стороны в C

float *x,*y; 
*x++=*y++ 

Может ли кто-нибудь объяснить, как это оценивается?

+1

gcc говорит: 'error: lvalue требуется как левый операнд присваивания' – wroniasty

+1

Удивительно или грустно, сколько ошибочных ответов появилось. –

+1

@wroniasty вы должны были ответить на этот вопрос :) – stardust

ответ

10

Для исходного кода:

x++ = y++ 

Эта строка никогда не будет оценена, потому что это не законно C и не будут собраны. Результат x++ не является значением lvalue и не разрешен в левой части задания.

Для изменения кода:

float x,y; 
*x++ = *y++ 

Это не является законным, поскольку * не может быть применен к float.

Я добавлю этот код:

float *x, *y; 
*x++ = *y++; 

Этот код говорит:

  • Пусть временно, скажем float *xt, равный x.
  • Позвольте временно, скажем float *yt, равным y.
  • Добавить 1 в x.
  • Добавить 1 в y.
  • Назначить: *xt = *yt.

фактические операции могут быть выполнены в различном порядке, обеспечивают xt берет свое значение перед x обновляется, yt берет свое значение перед y обновляется, и xt и yt определены прежде чем они будут использованы.

+0

Это точный ответ .... +1 для вас, сэр. –

0

Если две переменные являются int (или другим простым типом), исходное утверждение (x++=y++) является незаконным. Однако в случае арифметики указателя это законно. Один из способов, чтобы скопировать строку, в которой как x и y являются char *, является

while (*x++ = *y++); 

в этом случае указатель увеличивается после того, как соответствующий символ копируется, и цикл повторяется до тех пор, пока не встретится конец строки символ (NULL) в строке, на которую указывает y.

+0

Дарн, какой-то смешной счастливый чувак здесь. Думаю, я тоже знаю, кто это. В любом случае, нет ничего плохого в этом ответе, так что +1. – dasblinkenlight

+0

Спасибо, мне было интересно об этом. В любом случае, я вижу, что вопрос был изменен (хотя он все еще не прав). – unxnut

+0

@dasblinkenlight: Можете ли вы показать декларацию для 'x' и' y', чтобы компилировать 'x ++ = y ++'? Если нет, то утверждение, что «это законно», даже квалифицированное с «в случае арифметики указателя», неверно. Утверждение, что «модифицированное заявление, например, показанное ниже, является законным», может быть правдой. Приостановленное голосование не является постоянным; если ответ будет отредактирован, я передумаю его. –

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

  • Нет связанных вопросов^_^