В чем смысл следующей строки в C. Каков порядок ее выполнения?Приращение в обе стороны в C
float *x,*y;
*x++=*y++
Может ли кто-нибудь объяснить, как это оценивается?
В чем смысл следующей строки в C. Каков порядок ее выполнения?Приращение в обе стороны в C
float *x,*y;
*x++=*y++
Может ли кто-нибудь объяснить, как это оценивается?
Для исходного кода:
x++ = y++
Эта строка никогда не будет оценена, потому что это не законно C и не будут собраны. Результат x++
не является значением lvalue и не разрешен в левой части задания.
Для изменения кода:
float x,y;
*x++ = *y++
Это не является законным, поскольку *
не может быть применен к float
.
Я добавлю этот код:
float *x, *y;
*x++ = *y++;
Этот код говорит:
float *xt
, равный x
.float *yt
, равным y
.x
.y
.*xt = *yt
.фактические операции могут быть выполнены в различном порядке, обеспечивают xt
берет свое значение перед x
обновляется, yt
берет свое значение перед y
обновляется, и xt
и yt
определены прежде чем они будут использованы.
Это точный ответ .... +1 для вас, сэр. –
Если две переменные являются int (или другим простым типом), исходное утверждение (x++=y++
) является незаконным. Однако в случае арифметики указателя это законно. Один из способов, чтобы скопировать строку, в которой как x
и y
являются char *
, является
while (*x++ = *y++);
в этом случае указатель увеличивается после того, как соответствующий символ копируется, и цикл повторяется до тех пор, пока не встретится конец строки символ (NULL
) в строке, на которую указывает y
.
Дарн, какой-то смешной счастливый чувак здесь. Думаю, я тоже знаю, кто это. В любом случае, нет ничего плохого в этом ответе, так что +1. – dasblinkenlight
Спасибо, мне было интересно об этом. В любом случае, я вижу, что вопрос был изменен (хотя он все еще не прав). – unxnut
@dasblinkenlight: Можете ли вы показать декларацию для 'x' и' y', чтобы компилировать 'x ++ = y ++'? Если нет, то утверждение, что «это законно», даже квалифицированное с «в случае арифметики указателя», неверно. Утверждение, что «модифицированное заявление, например, показанное ниже, является законным», может быть правдой. Приостановленное голосование не является постоянным; если ответ будет отредактирован, я передумаю его. –
gcc говорит: 'error: lvalue требуется как левый операнд присваивания' – wroniasty
Удивительно или грустно, сколько ошибочных ответов появилось. –
@wroniasty вы должны были ответить на этот вопрос :) – stardust