2017-05-26 77 views
-2

爲什麼幾乎所有語言的字符串都要求您跳過引號?在字符串文字中解析引號

例如,如果你有一個字符串,如

"hello world"" 

爲什麼語言要你把它寫成

"hello world\"" 

你不僅需要該字符串開始,用引號結束?

您可以將結束報價視爲字符串的終止報價。如果沒有結束引用,則會出現錯誤。您還可以假定一個字符串在一行中開始和結束,並且不跨越多行。

+0

作爲一個人,你怎麼知道哪個引號是關閉的?對...更不用說機器了。 – revo

+0

你是對的,一個字符串必須以引號(或',取決於語言)開始和結束。寫「hello world」會導致* hello world *被打印,你會意識到嗎? – LJH

+0

引號是分隔符,不一定是語言,可以是csv文件。底線是_delimiters_用於解析源語言的每個方面。爲什麼問這個問題,寫一個新的語言? – sln

回答

1

假設我想將", "放入字符串文字(所以文字包含引號)。

如果我沒有逃脫,我會寫"", ""。這看起來像兩個用逗號分隔的空字符串文字。例如,如果我想用這個字符串文字調用函數,我會寫f("", "")。這看起來像編譯器,我傳遞兩個參數,都是空字符串。它如何知道它們的區別?

答案是,它不能。也許在像"hello world""這樣的簡單情況下,它可能會弄清楚,至少對於某些語言。但是,對於不同的語言來說,那些明確且不需要轉義的字符串會有所不同,並且很難追蹤哪一個是哪一個,並且對於任何語言來說都會有一些需要轉義的含糊情況。編譯器編寫者更容易跳過所有這些邊界情況,並且總是要求您避免使用引號,這對編程人員來說可能也更容易。

+0

非常好的一點,所以如果你的語言支持同一行上的多個字符串,這會造成不明確的地方。感謝洞察力:) – Har

1

編譯器將如何知道哪個報價結束了字符串?

UPDATE:

在C & C++,這是一個完全正常的字符串:

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

它打印Hello, World!

要不怎麼「回合是C#

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

現在應該打印Hello, WorldHello, "+"World!

+0

最後一個報價結束字符串,如果最後一個報價不存在,那麼出現錯誤 – Har

+1

然後解釋器應該如何在下面的代碼片段中標識*最後一個報價*:'hello =「Hello,」;世界=「世界!」;'? @Har – revo

+0

是的,我假定語言是基於行的,並且不能跨越多行或者每行有多個語句,但是即使在上面的示例中,遵循上面的規則,也會有一個字符串,工作...... – Har

0

您必須轉義第二個引號的原因是編譯器知道引號是字符串的一部分,而不是終結符。如果你不是逃避它,編譯器將只拿起hello world而不是hello world"

0

讓我們做一個實際的例子。

這應該如何翻譯?

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

通過轉義引號字符,您可以消除歧義,代碼應該對編譯器具有0不明確性。所有編譯器應該將相同的代碼編譯爲相同的可執行文件。它基本上是一種告訴編譯器的方式:「我知道這看起來很奇怪,但我的意思是它看起來很奇怪」

+0

可編譯的代碼對編譯器總是具有0的模糊性 - 因爲我確信編譯器總是會知道這兩種翻譯中的哪一種可供選擇。這個問題對於讀者來說是模棱兩可的。 –

+0

@JamesCurran是一個** Specific **編譯器,是的。但是,如何解釋它的含糊不清意味着不同的編譯器可能會對你的意思有不同的結論。 – Tezra