2014-11-04 2 views
2
int main() 
{ 
    int a=10; 
    int *b=&a; 
    int c=*b++; 
    printf("%d",c); 
} 

Я знаю следующие результаты программы 10.but в соответствии с очередностью таблицу, которая дает приоритет оператора http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm), после исправления ++ имеет более высокий приоритет, чем = и *. поэтому ++ должен оценивать сначала, а затем *. then почему программа печатает вывод как 10?путаница относительно * (звездочка) и ++ в C

+0

Возможно, вы хотели попробовать следующее: 'int c = (* b) ++;' (печатает 10) по сравнению с 'int c = ++ (* b);' (отпечатки 11). В обоих случаях 'a' равно 11. – JS1

ответ

3

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

Но увеличение на единицу упорядочено до конца оценки (это то, что postfix ++ делает, и это не связано напрямую с приоритетом), поэтому значение, которое вы получаете из указателя, является старым: p нет p+1. Имея этот указатель, вы разыщите его и получите значение a, которое равно 10. Затем указатель p увеличивается на единицу.

int c = *p ; 
p++ ; 
0

++ имеет более высокий приоритет, чем * означает операнд b будет связываться с ++ сначала как

int c = *(b++); 

Это не означает, что в любом случае, что оценки b++ первый, а затем разыменовывания оцененного значения. В *b++, ++ будет иметь такой же эффект на b, что и оператор приращения. *b++ - просто: Исключить исходное значение b и привить указатель b от 1.

0

Как вы говорите, ++ имеет более высокий приоритет, чем *. Итак, int c=*b++; анализирует как int c=*(b++);. Однако результатом операции после инкремента является значение до приращений. Другими словами, присвоение эквивалентно

int temp = b; 
b = b + 1; 
c = *temp; 
+0

Назначение также может быть эквивалентно' int temp = b; c = * temp; b = b + 1; '. – haccks

+0

@haccks Конечно. Я думаю, что способ, которым я его написал, более ясен в текущем контексте, поскольку первые две строки эквивалентны пост-приращению. Отсутствие близости в вашей версии устраняет эту проблему. –

0

++ будет делать приращение b, адреса памяти, после оценки в контексте большего выражения.

От http://msdn.microsoft.com/en-us/library/e1e3921c.aspx:

Важно отметить, что выражение постфикса увеличения или уменьшения определяет значение выражения перед нанесением соответствующего оператора. Операция приращения или уменьшения происходит после оценки операнда. Эта проблема возникает только тогда, когда операция увеличения или уменьшения постфикса происходит в контексте большего выражения.

Итак, что же происходит, что вы применяете приращение после починки к b, но разыменовать * дается первоначальное значение b, который указывает на 10. Если вы хотите распечатать b или *b, вы увидите, что значение и адрес изменились на нечто неожиданное.

0

Да, ++ имеет более высокий приоритет, чем *. Таким образом, заявление

int c=*b++; 

будет оцениваться как

int c=*(b++) 

Поскольку это оператор пост-фикс, указатель «б» увеличивается первый, но он возвращает старый адрес «B» (который указывает на сохранение значения 10). Следовательно, c будет иметь значение 10.

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