Вывод следующего - PullRequest
       0

Вывод следующего

0 голосов
/ 09 декабря 2018

Фрагмент кода

int main(){
    printf(5 + "GeeksQuiz"); 
    return 0;    
}

Вывод - тест

Можете ли вы сказать мне, как происходит этот вывод.Какая логика стоит за этим.

1 Ответ

0 голосов
/ 10 декабря 2018
  1. Дополнение коммутативно.a + b равно b + a.
  2. Добавление целого числа к приращению указателя следует арифметике указателя.Добавление целого числа к указателю увеличивает его на столько элементов, сколько на целое число.Таким образом, (int*)a + b равно (int*)((uintptr_t)a + b * sizeof(int))
  3. sizeof(char) всегда равно 1.
  4. "GeeksQuiz" является строковым литералом .strlen("GeeksQuiz") равно 9. С учетом строки, заканчивающейся нулевым байтом, тип литерала равен char[10].Это массив из 10 символов с содержимым {'G','e','e','k','s','Q','u','i','z','\0'}.
  5. . Правила C говорят, что массив типа в большинстве контекстов преобразуется в указатель на первый элемент этого массива.Это происходит здесь: (char[])"GeeksQuiz" преобразуется в char* указатель на первый символ 'G' в строке.
  6. 5 + "GeeksQuiz": "GeeksQuiz" преобразуется в указатель на первый символ.Затем этот указатель увеличивается на 5. Таким образом, результатом 5 + "GeeksQuiz" будет char* указатель, который будет указывать на символ 'Q' внутри строкового литерала.
  7. printf печатает переданную нулевую завершенную строкув качестве первого символа, за исключением преобразований, которые начинаются с %, что здесь не применимо.
  8. В функцию printf передается адрес указателя, который указывает на букву 'Q'внутри строкового литерала "GeeksQuiz".
  9. printf увеличивает указатель, пока не найдет строку, заканчивающуюся нулевым байтом.Таким образом, он напечатает {'Q','u','i','z'}, так как после символа z он найдет нулевой байт.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...