Обязательно ли экранировать символы табулятора в C и c++?
в C и C++ (и нескольких других языках) горизонтальные табуляторы (код ASCII 9) в символьных и строковых константах обозначаются в экранированной форме как 't' и "t". Однако, я регулярно вводить неэкранированных символов табуляции в строковые литералы как, например,"A B" (в betreen есть вкладка A и B), и по крайней мере clang++, похоже, не беспокоит - строка, похоже, эквивалентна "AtB". Мне нравится unescaped версия лучше, так как долго отступал многострочные строки лучше читаются в исходном коде.
теперь я спрашиваю себя, Является ли это вообще законным в C и C++ или просто поддержали мой компилятор. Как портативная несколько табуляторов неоставляют в символьных и строковых констант?
Удивительно, но я не мог найти ответ на этот, казалось бы, простой вопрос, ни с Google, ни на stackoverflow (я просто нашел этот смутно связанный вопрос).
4 ответов:
Да, вы можете включить символ табуляции в строку или символьный литерал, по крайней мере, в соответствии с C++11. Разрешенные символы включают (с моим акцентом):
любой член исходный набор символов за исключением двойная цитата
", обратная косая черта\, или символ новой строки(от стандарт C++11, приложение А. 2)
и исходный набор символов включает в себя:
пространство символ, управляющие символы, представляющие горизонтальный, вертикальная вкладка, подача формы и новая строка, а также следующие 91 графический символ
(от стандарт C++11 пункт 2.3.1)
обновление: Я только что заметил, что вы спрашиваете о двух разных языках. Для C99 ответ также Да. Формулировка другая, но в основном говорит то же самое:
в символьной константы или строковый литерал, члены набора символов выполнения должны быть представлены соответствующими членами исходный набор символов или [...]
где исходные и исполнительные наборы символов включают
управляющие символы, представляющие горизонтальный, вертикальная табуляция, и подача страницы.
совершенно законно помещать символ табуляции непосредственно в символьную строку или символьный литерал. Стандарты C и C++ требуют, чтобы исходный набор символов включал символ табуляции, а строковые и символьные литералы могут содержать любой символ в исходном наборе символов, кроме обратной косой черты, кавычки или Апострофа (при необходимости) и новой строки.
Так что это портативный. Но это не очень хорошая идея, так как читатель не может различать различные виды пробелов. Это также довольно распространено для текстовых редакторов, почтовых программ и т. п. для переформатирования вкладок, поэтому ошибки могут быть введены в программу в ходе таких операций.
если вы введете вкладку во вход, то ваша строка будет содержать буквенный символ вкладки, и он останется символом вкладки - он не будет волшебным образом переведен в
\tвнутренне.то же самое касается написания кода - Вы можете вставлять литеральные символы табуляции в свои строки. Однако учтите следующее:
T T T <--tab stops 012345012345012345012345 foo1 = 'a\tb'; foo2 = 'a b'; // pressed tab in the editor foo3 = 'a b'; // hit space twice in the editorесли вы поместите курсор на пробел между
aиbи проверил, сколько символов там, по сути, нет способа определите, есть ли там вкладка или фактические символы пробела. Но с помощью\tверсия, она сразу же отображается как вкладка.
когда вы нажимаете клавишу TAB, вы получаете любую кодовую точку, на которую ваша система отображает этот ключ. Эта кодовая точка может быть или не быть вкладкой в системе, где работает программа. Когда вы помещаете \t в литерал, компилятор заменяет его соответствующей точкой кода для целевой системы. Поэтому если вы хотите быть уверены, что вы получите вкладку на компьютере, на котором запускается программа, используйте \t. Это его работа.
Comments