Последний вызов printf выводит конечный ноль строкового литерала в виде целого числа.
Для ясности рассмотрим строковый литерал с одним действительным символом, например "A"
.
Перед первой итерацией while l oop
while (*ptr++)
{
printf("%c-", *ptr);
least = ((*ptr) < (least)) ? (*ptr) : (least);
}
указатель ptr указывает на символ 'A' строкового литерала. Это выражение
*ptr++
можно представить как
char c = *ptr;
++ptr;
Таким образом, управление переходит к телу l oop, потому что 'A' не равно нулю. Тем временем указатель ptr был увеличен после оценки состояния. Так что теперь он указывает на завершающий ноль '\ 0' строкового литерала.
Так как 0 меньше 123, тогда переменная меньше всего получает значение 0.
least = ((*ptr) < (least)) ? (*ptr) : (least);
В следующем итерация l oop ptr по-прежнему указывает на конечный ноль. Таким образом, элемент управления обходит тело l oop, и ноль выводится в следующем операторе после l oop.
из стандарта C (6.5.2.4 Операторы приращения и уменьшения после записи)
2 Результатом оператора post-x ++ является значение операнда . Как побочный эффект, значение объекта операнда увеличивается (то есть к нему добавляется значение 1 соответствующего типа).