2014-09-15 2 views
1

Я наткнулся на следующую программу.Операторы и приоритет в c

#include<stdio.h> 
    int main() 
    { 
     char *s[] = { "knowledge","is","power"}; 
     char **p; 
     p = s; 
     printf("%s ", ++*p); 
     printf("%s ", *p++); 
     printf("%s ", ++*p); 

     return 0; 
    } 

Выход: nowledge nowledge s Я уверен, что
1.First PRINTF печатает nowledge
Printf также 2. Во-вторых печатает nowledge, поскольку она содержит пост инкремент так исходное значение первого Printf удерживается.
Теперь на этом этапе я смущен, что именно * p ++ делает. Теперь p будет указывать на is или owledge.

+1

Запустите его и проверьте. – Haris

+0

Я знаю выход .. но я хочу знать объяснение - @ralph – PsYcHeD

+0

Почему вы не читаете документацию по приоритету оператора?Вы должны научиться тому, как это сделать, чтобы вы могли рассуждать о коде. –

ответ

1

Этот вывод этой программы довольно запутан, потому что ++*p увеличивает значение, на которое указывает p, что делает разные элементы строкового массива s для увеличения.

printf("%s ", ++*p); 

Значение, возвращаемое *p получает приращение. p указывает на s[0]. Поэтому s[0] указывает на "nowledge".

printf("%s ", *p++); 

p все еще указывает на первый элемент массива char *. Поскольку мы увеличили значение s[0] на один ранее, s[0] по-прежнему указывает на "nowledge". p увеличивается после разыменования.

printf("%s ", ++*p); 

Значение, возвращаемое *p, увеличилось. s[1] будет увеличиваться и указывать на "s".

0

значение при * р имеет тип * символ (значение указателя является адрес, который выделяется размер типа это указывает на)

увеличивающиеся это привело бы к этому значению добавляется SizeOf (Char)

это похоже на написание этого:

printf("%s ", ++(*p)); 

значение в точке р имеет тип ** полукокса

Инкрементирование это приведет к тому, что значение добавит typeof (* char).

разница в том, что значение следующего адреса, держащего * полукокса является адрес первого символа в следующей массив символов

Я не смотрел на старшинства лист (который я что вы можете найти в простой поиск Google) но запуск кода вы можете понять, что предшествует ++ *

, если вы хотите, чтобы проверить его запустить это:

printf("%s ", (*p)++); 
+0

Да, но когда я увеличиваю p, почему он перескакивает на «is», тогда как над двумя printf это приращение символа по символу. В первом printf 'K' было опущено. Итак, почему после второго курсора printf прыгнул в следующую строку «is». – PsYcHeD

0
char *s[] = { "knowledge","is","power"}; // s is an array of pointers 
    char **p; // p is a pointer to a pointer to char 
    p = s; 
    printf("%s ", ++*p); //(*p) pointing to first string of s, pre-increment so "nowledge" printed 
    printf("%s ", *p++); // (*p) printed then post-increment of p (not *p) hence jumped to next pointer in the array s 
    printf("%s ", ++*p); 
Смежные вопросы