"\n","\t" 如何分别添加新行和制表符?
Posted
技术标签:
【中文标题】"\\n","\\t" 如何分别添加新行和制表符?【英文标题】:How "\n","\t" adds a new line and tab respectively?"\n","\t" 如何分别添加新行和制表符? 【发布时间】:2016-02-07 07:07:58 【问题描述】:在编程语言中,如果我使用“\n”,它会添加一个换行符。
有人能解释一下“\n”是如何被翻译成换行符的吗?“\t”也是如此?
【问题讨论】:
一点reading 会有很大帮助。 你所说的“给予”是什么意思,你所指的“它”是什么?你是在问文字序列"\n"
如何成为字符串常量中的换行符?
这仅适用于特定功能,例如printf
。每当函数找到带有format string
(通常是第一个参数)的'\' 字符时,它就知道下一个字符 应该是一个特殊命令,而不是文字字符。此外,您应该从现有的答案中选择一个答案,因为其中一些很好地解释了该过程的工作原理。不要忽视那些花时间帮助你解决问题的人。
@mrDudePerson 这完全不正确。您所指的所有识别和翻译都是由编译器执行的,而不是函数。
是的,没错,我将转义字符与“%d”之类的东西混为一谈。
【参考方案1】:
当编译器正在读取您的程序并看到backslash something
时,它知道“假装”它看到了其他内容。你可以想象编译器的一部分是这样工作的:
current_character = getNextCharacter();
if (current_character == BACKSLASH)
current_character = getNextCharacter();
if (current_character == 'n')
/*oh, they want a newline */
else if (current_character == 't')
/* it's a tab they want */
else /* ... and so on and so forth */
【讨论】:
参考某人的想象?一个奇怪的概念。无论如何,如果您想了解编译器,这似乎是本书 www.amazon.com/Compilers-Principles-Techniques-Alfred-Aho/dp/0201100886【参考方案2】:假设我们在语言中讨论字符串,例如"Hello,\tWorld\n"
,那么编译器的工作就是检测反斜杠,然后将该机器上的换行符和制表符插入适当的字符序列到生成的可执行文件中的字符串中.
在编译器中处理这个问题的代码相当复杂,因为在解析代码时需要记住大量的其他事情,但如果我们稍微简化一下:
if (inQuote) // So inside ' or "
if (currentChar == '\')
switch(nextChar)
case 'n':
InsertNewLine();
break;
case 't':
InsertTab();
break;
case 'b':
InsertBackSpace();
break;
... several more of these ...
case '\': // '\\' outputs one '\'
InsertBackSlash();
break;
default:
Insert(nextChar); // Ignore any others.
break;
我为InsertXX
作弊并创建了函数,但实际上,它可能只是一个*output++ = 10;
或*output++ = 9;
[或一些定义的常量,可以转换为相同的值]。
【讨论】:
【参考方案3】:\ 字符在许多语言中是一个“转义字符”。使用该字符,您可以添加特殊的不可打印字符,例如换行符或制表符,还可以添加引号。如果需要使用 " 分隔字符串,可以使用 \" 在其中打印引号。
对于 windows 命令提示符,^ 的作用与打印特殊字符类似。
【讨论】:
【参考方案4】:编译器知道,当它在字符串中看到 \n 或 \t 时,它必须用特殊的东西替换它:换行符或制表符。这只是惯例,反斜杠后跟一个特殊字符 (n,l,t,...) 意味着一些特殊的东西。
这种约定的原因是在文本编辑器中编写程序时,不可能在字符串中嵌入真正的换行符和制表符,因此为了帮助程序员,他们开发了这种约定。
【讨论】:
这是语言的一个特性(至少对于 C 和 C++ 而言),而不是库函数。 @jonathan-potter,你是对的。编译器将这些特殊值转换为它们的 ascii 值,而不是库。我会修正我的答案。 不是 ASCII 而是编译的目标字符集和编码。【参考方案5】:编译器将字符串 ("hello"
) 存储为字符集合 ('h', 'e', 'l', 'l', 'o'
)。此外,将这些字符存储为数字——然后将其表示为位等。
\n
代表一个字符,虽然我用了两个字符来写。从人类可读字符到存储数字的转换需要经过一些标准化系统,例如 ASCII 或 unicode。在 ASCII 中,换行符由十进制数 10 表示(请参阅http://www.asciitable.com/index/asciifull.gif)。 “A”是 65,“B”是 66,依此类推。每个小写字母都有自己的数字,与大写字母不同,从 97 开始。
换行符仅在打印字符时转换为实际的换行符。每当\n
之类的特殊字符出现在System.out.print()
中时,程序都会要求终端产生所需的输出,例如跳到下一行。
终端将此进一步委托给操作系统,最后委托给显卡以实际使像素移动。每个部分都有自己的职责范围,而其他每个部分都不了解该区域内部的事情是如何完成的。只是他们可以相互交流并让事情发生。
请记住,大多数计算机系统都是由一大群人组成的。很少有人知道幕后发生的一切。而这一切的美妙之处在于他们不需要!
【讨论】:
从编译器翻译\n.
的那一刻起,换行符就已经是换行符了。所有关于运行时发生的事情都由 ASCII 或 Unicode 定义决定,不再需要考虑。【参考方案6】:
换行符是一个“转义序列”,之所以这么叫,是因为反斜杠符号被认为是一个转义字符——它会导致对字符串的正常解释进行转义,以便下一个字符被识别为具有特殊含义的字符意义。 例如,
\n 引入了一个新行。 \t 引入了一个选项卡。 \\ 插入反斜杠 \” 插入双引号。【讨论】:
如果这是引用,请提供引用。如果不是,请不要对未引用的文本使用引号格式。以上是关于"\n","\t" 如何分别添加新行和制表符?的主要内容,如果未能解决你的问题,请参考以下文章
2016"百度之星" - 初赛(Astar Round2A)
C语言选择题 以下四个程序中不能对两个整型值进行交换的是( )
有以下程序: main( ) int a[10]=1,2,3,4,5,6,7,8,9,10,*p=&a[3],*q=p-2; printf("%d\n",*p+*q);
java web 的问题:Expecting "jsp:param" standard action with "name" and "value&q