解析字符串文字中的引号

Parsing quotes within a string literal

为什么几乎所有语言的字符串都要求您转义引号?

例如,如果您有一个字符串

"hello world""

为什么语言要你把它写成

"hello world\""

您不仅要求字符串以引号开头和结尾吗?

您可以将结束引号视为字符串的终止引号。如果没有结束引号,则存在错误。您还可以假设一个字符串在一行上开始和结束并且不跨越多行。

编译器如何知道哪个引号结束了字符串?

更新:

在 C 和 C++ 中,这是一个非常好的字符串:

printf("Hel"   "lo" "," "Wor""ld"  "!");

它打印 Hello, World!

或者 C# 怎么样

Console.WriteLine("Hello, "+"World!");

现在应该打印 Hello, World 还是 Hello, "+"World!

必须转义第二个引号的原因是编译器知道引号是字符串的一部分,而不是终止符。如果你没有转义它,编译器只会选择 hello world 而不是 hello world"

否则,编译器会将第二个引号视为字符串的结尾,然后是随机引号,从而导致错误。

"The use of the word "escape" 的真正意思是暂时脱离文本解析并进入另一种模式,在这种模式下后续字符将被区别对待。"资料来源:https://softwareengineering.stackexchange.com/questions/112731/what-does-backslash-escape-character-really-escape

假设我想将 ", " 放入字符串文字中(因此文字包含引号)。

如果我这样做而不转义,我会写 "", ""。这看起来像两个用逗号分隔的空字符串文字。例如,如果我想用这个字符串文字调用一个函数,我会写 f("", "")。在编译器看来,这就像我传递了两个参数,都是空字符串。它怎么知道区别?

答案是,不能。也许在像 "hello world"" 这样的简单情况下,至少对于某些语言,它可能能够弄清楚。但是明确且不需要转义的字符串集对于不同的语言会有所不同,并且很难跟踪哪个是哪个,并且对于任何语言都会有一些歧义的情况无论如何都需要转义。对于编译器编写者来说,跳过所有这些边缘情况并总是要求您转义引号要容易得多,对于程序员来说也可能更容易。

让我们做一个实际的例子。

这应该怎么翻译?

"Hello"+"World"
    'HelloWorld' or 'Hello"+"World'
vs
"Hello\"+\"World"

通过转义引号字符,您消除了歧义,代码对编译器的歧义应该为 0。所有编译器都应该将相同的代码编译成相同的可执行文件。它基本上是一种告诉编译器 "I know this looks weird, but I really mean that this is how it should look"

的方式