C позволяет строковой конструкции указывать инициализированный массив символов.
Отдельные символы в строке могут быть экранированы для представления
непечатные символы. Например,
"Hello world\n"
представляет строку с символом "\n
", представляющую новую строку
характер.
Рисунок 2.1 - идеализация кода в компиляторе C, который
интерпретирует escape-последовательность символов Это удивительный кусок
код. Он «знает» полностью переносимым образом, что такое код символа
скомпилировано для новой строки в любом наборе символов. Акт познания тогда
позволяет ему перекомпилировать себя, тем самым увековечивая знания.
Предположим, мы хотим изменить компилятор C, чтобы включить последовательность "\v
" в
представляет символ вертикальной табуляции. Расширение к рисунку 2.1
очевидно и представлено на рисунке 2.2. Затем мы перекомпилируем C
компилятор, но мы получаем диагностику. Очевидно, что поскольку бинарная версия
компилятора не знает о "\v
", источник не является легальным C. Мы
должен "обучить" компилятор. После того, как он «знает», что означает «\v
», наш
новое изменение станет законным C. Мы смотрим на график ASCII, что
вертикальная табуляция десятичная 11. Мы изменяем наш источник, чтобы он выглядел как рисунок
2,3. Теперь старый компилятор принимает новый источник. Мы устанавливаем
получившийся двоичный файл в качестве нового официального компилятора C, и теперь мы можем написать
портативная версия, как у нас на рисунке 2.2.
Это глубокая концепция. Это так же близко к программе обучения, как и я
видел. Вы просто скажете это один раз, тогда вы можете использовать это
самореферентное определение.
Рисунок 2.1
c = next();
if (c != '\\')
return(c);
c = next();
if (c == '\\')
return('\\');
if (c == 'n')
return('\n');
Рисунок 2.2
c = next();
if (c != '\\')
return(c);
c = next();
if (c == '\\')
return('\\');
if (c == 'n')
return('\n');
if (c == 'v')
return('\v');
Рисунок 2.3
c = next();
if (c != '\\')
return(c);
c = next();
if (c == '\\')
return('\\');
if (c == 'n')
return('\n');
if (c == 'v')
return(11);