(который на самом деле также восьмеричный по той же причине)

я есть следующий код -

#include <stdio.h>
#define LENGTH 5
int main(){
    char* ch[LENGTH] = {"Zero", "One", "Two", "Three", "Four"};
    char* pc;
    char** ppc;
    for(int i=0; i<LENGTH; i++){
        ppc = ch+i;
        pc = *ppc;
        while(*pc != 0){
            printf("%c ", *pc);
            pc = pc +1;
        }
        printf("\n");
    }
    return 0;
}

Это пример множественного косвенного обращения с использованием строки.

Выход

Z e r o 
O n e 
T w o 
T h r e e 
F o u r 

Здесь вwhile() цикл вместо*pc != '\0', *pc != 0 используется.

Но оба подхода дают одинаковый результат. Почему это так?

 Tom Blodget15 дек. 2017 г., 18:39
Ответы объяснят почему. Я просто хотел бы согласиться с тем, что нет смысла сравнивать символ с целым числом при обработке символов. Должно быть либоwhile (*pc != '\0') или жеwhile (*pc).

Ответы на вопрос(4)

0 а также'\0' точно такое же значение, и в C, являютсяобе int типы. Это исправлено стандартом C и являетсянезависимо кодировки символов на вашей платформе. Другими словами, ониполностью неразличимы. (В C ++ тип'\0' этоchar.)

Такwhile(*pc != 0), while(*pc != '\0'), а такжеwhile(*pc) в этом отношении все одно и то же.

(Лично я нахожу последний, который я даю, самый ясный, но некоторые люди любят использовать'\0' обозначения при работе со строками в стиле C.)

 Bathsheba15 дек. 2017 г., 09:01
Нет, это тоже хорошо определенный C ++, хотя на этом языке вам бы посоветовали использоватьstd::string класс из стандартной библиотеки C ++. Плюс компиляторы C ++ могут больше жаловаться на тот факт, что строковые литералы распадаются наconst char* указатель, а неchar* указатель.
 Suraj15 дек. 2017 г., 09:04
В чем недостаток "использования пространства имен std;" ?
 Suraj15 дек. 2017 г., 09:01
Так что же код даст ошибку в C ++?
 Bathsheba15 дек. 2017 г., 09:05
@Suraj: Это кривая для этого вопроса. По сути, это загрязняет ваше глобальное пространство имен.
 Suraj15 дек. 2017 г., 09:06
что означает "загрязнять глобальное пространство имен"?

стражцитируяC11Глава § 5.2.2

В символьной константе или строковом литерале члены набора символов выполнения должны быть представлены соответствующими элементами исходного набора символов или escape-последовательностями, состоящими из обратной косой черты\ сопровождаемый одним или несколькими символами.Байт со всеми битами, установленными в 0, называемый нулевым символом, должен существовать в базовом наборе символов выполнения; он используется для завершения символьной строки.

и из главы §6.4.4.4 / P12,

Пример 1. Конструкция.'\0' обычно используется для представления нулевого символа.

Итак, постоянная\0 тот, который удовлетворяет вышеупомянутому свойству. Этовосьмеричная escape-последовательность.

Теперь, что касается значения, цитируя §6.4.4.4 / P5, (акцент мой)

Восьмеричные цифры, которые следуют за обратной косой чертой в восьмеричной escape-последовательности, считаются частью построения одного символа для целочисленной символьной константы или одного широкого символа для широкой символьной константы.Числовое значение восьмеричного восьмеричного целого числа указывает значение желаемого символа или широкого символа.

Итак, для восьмеричной escape-последовательности'\0', значение0 (ну, как в восьмеричном, как упомянуто в §6.4.4.1, так и десятичном).

 M.M15 дек. 2017 г., 09:06
Обратная косая черта с последующим0 восьмеричная escape-последовательность0 в восьмеричном0 (который на самом деле также восьмеричный по той же причине)
Решение Вопроса

\n, вкладка\t etc имеет свои собственные символы escape-последовательности, но на самом деле не существует ни одного символа для нулевого терминатора.

Поэтому промышленный стандарт де-факто стандартного представления нулевого терминатора заключается в написаниивосьмеричная escape-последовательность со значением ноль, Восьмеричные escape-последовательности определены как\ с последующим номером. Так\0 просто означает ноль, с восьмеричным представлением. Поскольку это похоже на другие escape-последовательности символов, де-факто стало стандартным способом представления нулевого терминатора.

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

char на самом деле не более, чем маленькое целое число, и как таковые неявно преобразуются вint, Кроме того, символьные литералы (например,'') действительно представлены компилятором какint значения (например, буквенный символ'' представленint стоимость65 вSCII кодирование).

Язык C позволяет вставить любое произвольное целое число (которое может поместиться вchar) с помощьюускользает, Есть два способа избежать таких произвольных значений, используявосьмеричный номера, или используяшестнадцатеричный, Например, значение SCII для 65, что может быть представлено как'', '\101' в восьмеричном,'\x41' в шестнадцатеричном,или же гладкий65.

Вооружившись этой информацией, легко заметить, что'\0' является восьмеричным представлением целого числа0, Это,'\0' == 0.

Вы можете легко проверить это, напечатав это:

printf("'\\0' = %d\n", '\0');

Я упоминал, что компилятор обрабатывает все символьные литералы какint значений, но также упомянул, что произвольные числа, использующие экранированные восьмеричные или шестнадцатеричные числа, должны соответствоватьchar, Это может показаться противоречием, но на самом деле это не так. Значение символа должно вписываться вchar, но компилятор затем внутренне преобразует его вint когда он разбирает код.

 Some programmer dude15 дек. 2017 г., 14:49
@Suraj Обновил ответ, чтобы, надеюсь, было легче понять.
 Bathsheba15 дек. 2017 г., 09:09
Обратите внимание, что в C онинаходятся ints. Поэтому не требуется никакого преобразования, даже неявного.
 Suraj15 дек. 2017 г., 09:13
Не мог следовать. Можете ли вы уточнить?
 Ahmed Karaman15 дек. 2017 г., 13:08
@Suraj Каждый символ может быть представлен значением ASCII в диапазоне от 0 до 255. Значение ASCIINULL равно 0, поэтому его возвращаемое значение true, когда вы сравниваете его с ним. То же самое касается буквы «а», которая имеет значение ASCII 97, например, если вы сравните'a'==97 это вернетсяtrue.
 Suraj15 дек. 2017 г., 14:33
@ Someprogrammerdude Мне очень жаль, потому что мой комментарий был неясным. Я следовал вашему ответу. То, что я не мог следовать, это ваш первый комментарий.

Ваш ответ на вопрос