«Упростить» до одной строки - PullRequest
2 голосов
/ 28 декабря 2010

просто делаю мои домашние задания и обнаружил этот кусок

A[j]=A[j-1];
j--;

Есть ли способ упростить это до одной строки? изменить один оператор?

Я пробовал

A[j--]=A[j];

но, похоже, он не работает хорошо.

код из алгоритма InsertSort

edit этот вопрос не требуется, чтобы делать домашнюю работу, мне просто любопытно

Ответы [ 3 ]

7 голосов
/ 28 декабря 2010

Из стандарта:

Между предыдущей и следующей точкой последовательности объект должен иметь свое сохраненное значение, измененное не более одного раза путем оценки выражения. Кроме того, предыдущее значение должно быть только для чтения, чтобы определить значение, которое будет сохранено.

То есть A[j] = A[--j]; приведет к неопределенному поведению. Не делай этого. A[j]=A[j-1]; j--; совершенно ясно, кратко и удовлетворительно.

6 голосов
/ 28 декабря 2010

Если цель состоит в том, чтобы просто убрать ; в середине, чтобы вы могли использовать его в контексте макроса или как отдельный оператор без фигурных скобок, попробуйте использовать оператор запятую *1003*:

A[j]=A[j-1], j--;

или если вы хотите присвоить значение в результате выражения:

j--, A[j+1]=A[j];

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

Как уже говорили другие, любая попытка сделать это без оператора запятой приведет к неопределенному поведению из-за проблем с точкой последовательности.Если у вас нет веских причин для сжатия кода, подобного этому, я бы рекомендовал даже не делать этого.Если вы не очень разбираетесь в C, вы почти наверняка перепутаете это и вводите тонкие ошибки (некоторые из которых могут проявиться не с вашим текущим компилятором, а в будущих версиях, создавая ад для тех, кто застрянет, отлаживая код).

0 голосов
/ 13 января 2011

На самом деле есть способ

A[j+1]=A[--j];

хорошо работает в VC, но вызывает UB на g ++

...