2012-07-27 2 views
0

В сегменте кода, я видел эту неуплотненном форму:старшинства и associatives в C

while(p1>=str1) 
{ 
    *p2 = *p1; 
    p1--; 
    p2++; 
} 

в то время как уплотненная форма выглядит примерно так:

while(p1>=str1) 
{ 
    *p2++ = *p1--; 
} 

, что делает этот код, как ясно показано в некомпактной форме он сначала копирует содержимое указателей, прежде чем увеличивать p2 и уменьшает p1, но как это может быть указано, что приоритет ++ выше, чем оператор присваивания в C? Я думал, что может быть оператор some(), чтобы заставить это, но в книге это правильно. Может кто-нибудь объяснить это? Thanks

ответ

1

p2++ выражение дает значение p2, а не p2 + 1. Операция приращения выполняется как точка последовательности.

3

Приоритет просто влияет на то, как код анализируется, то есть на что ссылается ++. Вот почему это:

*p2++ = *p1--; 

эквивалентно следующему:

(*(p2++)) = (*(p1--)); 

Но семантика ++ должны оценить исходное значение, а затем для увеличения значения. Таким образом, назначение будет использовать старые значения p1 и p2, а затем после выполнения задания будет увеличивать и уменьшать их.

+0

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

+0

Синтаксис верен, потому что операторы постфикса не считаются частью оценки операторов до тех пор, пока оценка не будет оценена (не совсем правильно, но простой способ подумать об этом). На самом деле, хотя я не уверен, что это также относится к C, я помню, что чтение операторов postfix не рекомендуется для использования в C++, поскольку они вызывают временную копию переменной, к которой применяется оператор, предположительно, чтобы использовать старое значение, позволяя сохранить новое значение. – JAB

1

Операторы постфиксатора ++ и -- вступают в силу после выполнения инструкции, в которую они включены. Приоритет влияет на то, как маркеры сгруппированы, и как генерируется синтаксическое дерево (я, вероятно, использую неправильный словарь здесь) для оператора.

В принципе, *p2++ = *p1--; эквивалентно *p2 = *p1; p2 += 1; p1 -= 1;

Будьте осторожны с пост- и префиксов операторов, хотя; Я считаю, что делать что-то вроде p2 = p1++ * p1--; считается неопределенным поведением.

+0

'(p1 ++) -' недопустим в C, поскольку 'p1 ++' не является значением lvalue. – ouah

+0

О, хорошо, используя лучший пример. – JAB

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