печать символа из указателя символа - PullRequest
1 голос
/ 15 августа 2011
#include <stdio.h>

int main()
{
 char *arr = "This is to test";
 printf("\n%c %c ",*(arr++), *(arr++));
 return 0;
}

Эта программа выводит h T вместо вывода h h.Почему это так?

Ответы [ 4 ]

7 голосов
/ 15 августа 2011

Использование двух операторов приращения в одном операторе, которые не зависят друг от друга, приводит к неопределенному поведению, потому что компилятор свободен выбирать, какое приращение делать первым (или, скорее, вы не дали компилятору подсказки, какой делать первым).

В любом случае, если вы ожидаете h h, также неправильно писать *(arr++) дважды, потому что они будут выполняться оба, увеличивая arr в два раза - и такбудут напечатаны два разных символа (arr[0] и arr[1]).

Другая ошибка заключается в использовании постинкремента, который приведет к увеличению arr после выборки символа,поэтому он выведет T, а не h.

Таким возможным решением является этот код, использующий дополнительную переменную:

#include <stdio.h>

int main()
{
 char *arr = "This is to test";
 char c = *(++arr);
 printf("\n%c %c ", c, c);
 return 0;
}

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

5 голосов
/ 15 августа 2011

arr ++ эквивалентно arr + = 1. Вы на самом деле увеличиваете arr.Это то, что происходит в вашей ситуации.

printf("\n%c %c ",*(arr++), *(arr++));
//                  ^         ^Evaluates to 0 therefore prints T then increments by 1
//                  ^Evaluates to 1 therefore prints h and then increments by 1
//Now if where to prinf %s arr it should print "is is to test"

То, что вы хотите сделать, это

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

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

1 голос
/ 15 августа 2011

, если вы должны получить результат h h.тогда вам нужно написать

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

, но здесь в вашем коде вы обновили arr, и этот инкремент является постинкрементным, поэтому сначала он присваивает значение аргументу функции, а затем переменная будет увеличиваться.в функции

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

значения присваиваются в стеке слева направо, поэтому вы можете представить себе следующее утверждение:

printf("\n%c %c ",'h', 'T');

и аргумент "\ n% c% c" выведет выводслева направо, и вы получили выход h T.

1 голос
/ 15 августа 2011

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

Это потому, что унарный оператор arr ++ вызовет arr = arr + 1;, и, поскольку он использует постфиксный оператор, он напечатает перед присвоением результата arr.

выполняются следующие шаги:

  1. Печать T
  2. перемещение указателя на h
  3. Печать h
  4. перемещение указателя на i

Если бы у вас было три в одной строке, вы бы получили ih T, поскольку это заставило бы его двигаться в третий раз.

То, что вы пытаетесь сделать, - это что-то вроде:

printf("\n%c %c ",*(arr+1), *(arr+1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...