为什么几乎所有语言的字符串都要求您跳过引号?在字符串文字中解析引号
例如,如果你有一个字符串,如
"hello world""
为什么语言要你把它写成
"hello world\""
你不仅需要该字符串开始,用引号结束?
您可以将结束报价视为字符串的终止报价。如果没有结束引用,则会出现错误。您还可以假定一个字符串在一行中开始和结束,并且不跨越多行。
为什么几乎所有语言的字符串都要求您跳过引号?在字符串文字中解析引号
例如,如果你有一个字符串,如
"hello world""
为什么语言要你把它写成
"hello world\""
你不仅需要该字符串开始,用引号结束?
您可以将结束报价视为字符串的终止报价。如果没有结束引用,则会出现错误。您还可以假定一个字符串在一行中开始和结束,并且不跨越多行。
假设我想将", "
放入字符串文字(所以文字包含引号)。
如果我没有逃脱,我会写"", ""
。这看起来像两个用逗号分隔的空字符串文字。例如,如果我想用这个字符串文字调用函数,我会写f("", "")
。这看起来像编译器,我传递两个参数,都是空字符串。它如何知道它们的区别?
答案是,它不能。也许在像"hello world""
这样的简单情况下,它可能会弄清楚,至少对于某些语言。但是,对于不同的语言来说,那些明确且不需要转义的字符串会有所不同,并且很难追踪哪一个是哪一个,并且对于任何语言来说都会有一些需要转义的含糊情况。编译器编写者更容易跳过所有这些边界情况,并且总是要求您避免使用引号,这对编程人员来说可能也更容易。
非常好的一点,所以如果你的语言支持同一行上的多个字符串,这会造成不明确的地方。感谢洞察力:) – Har
编译器将如何知道哪个报价结束了字符串?
UPDATE:
在C & C++,这是一个完全正常的字符串:
printf("Hel" "lo" "," "Wor""ld" "!");
它打印Hello, World!
要不怎么“回合是C#
Console.WriteLine("Hello, "+"World!");
现在应该打印Hello, World
或Hello, "+"World!
?
您必须转义第二个引号的原因是编译器知道引号是字符串的一部分,而不是终结符。如果你不是逃避它,编译器将只拿起hello world
而不是hello world"
否则,编译器会看到第二个引号,你字符串的结束,然后随机引号跟随它,引起错误。
“使用”escape“一词实际上意味着暂时退出解析文本并进入另一种模式,其中后续字符的处理方式不同。来源:https://softwareengineering.stackexchange.com/questions/112731/what-does-backslash-escape-character-really-escape
让我们做一个实际的例子。
这应该如何翻译?
"Hello"+"World"
'HelloWorld' or 'Hello"+"World'
vs
"Hello\"+\"World"
通过转义引号字符,您可以消除歧义,代码应该对编译器具有0不明确性。所有编译器应该将相同的代码编译为相同的可执行文件。它基本上是一种告诉编译器的方式:“我知道这看起来很奇怪,但我的意思是它看起来很奇怪”
可编译的代码对编译器总是具有0的模糊性 - 因为我确信编译器总是会知道这两种翻译中的哪一种可供选择。这个问题对于读者来说是模棱两可的。 –
@JamesCurran是一个** Specific **编译器,是的。但是,如何解释它的含糊不清意味着不同的编译器可能会对你的意思有不同的结论。 – Tezra
作为一个人,你怎么知道哪个引号是关闭的?对...更不用说机器了。 – revo
你是对的,一个字符串必须以引号(或',取决于语言)开始和结束。写“hello world”会导致* hello world *被打印,你会意识到吗? – LJH
引号是分隔符,不一定是语言,可以是csv文件。底线是_delimiters_用于解析源语言的每个方面。为什么问这个问题,写一个新的语言? – sln