1

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

Программа 1:

char arr[] = "geeksforgeeks"; 
char *p = arr; 
*p++; 
printf(" %c", *p); 

Программа 2:

char arr[] = "geeksforgeeks"; 
char *ptr = arr; 

while(*ptr != '\0') 
    ++*ptr++; 
printf("%s %s", arr, ptr); 
+1

Пожалуйста, не пишите такой код. Ты не знаешь, что ты хочешь. –

+0

Какая часть, точно? – Bathsheba

+0

здесь в первой программе * p ++ оценивается как * (p ++), потому что post fix имеет более высокий приоритет над указателем * – skvatss

ответ

1

Сначала давайте упростить вашу программу в то, что сопоставимо:

char arr[] = "geeksforgeeks"; 
char* p = arr; 

*p++; 
printf("%s %c\n", arr, *p); 

char* ptr = arr; 

++*ptr++; 
printf("%s %c\n", arr, *ptr); 

Следующая позволяет посмотреть на operator precedence и выдвигают гипотезу, что мы ожидаем:

  1. приращения Postfix (Случается 1 ул, потому что он имеет самый высокий приоритет трех операторов)
  2. разыменования (бывает 2 й, потому что операторы старшинства 2 ассоциированных справа-слева)
  3. Prefix прирост (Случается последний, потому что это самый левый оператор низшего приоритета)

Таким образом, мы ожидаем, *p++ не иметь никакого эффекта, кроме продвижения p к 2 й положения, потому что:

  1. Postfix увеличивает p
  2. разыменовать адрес p без приращения адреса

И мы ожидаем, что ++*ptr++ приращения текущего символа и перехода ptr к 2 nd позиция, поскольку:

  1. Postfix увеличиваем ptr
  2. разыменовать адрес ptr без приращения адреса
  3. Increment значение char по адресу ptr

И глядя на эту Live Example вы можете увидеть, что наша гипотеза Правильно, мы даже получаем предупреждение о том, что:

Вычисленное значение не используется [-Унимое значение] *p++

Наши результаты:

geeksforgeeks е
heeksforgeeks е

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

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