这个问题困扰了我一段时间。我看到很多人在他们的代码中使用软引号。然而,我几乎在任何地方都使用硬引号。我认为在某些情况下,硬引号可能会更好(例如在 PHP 中将变量放在带有荣誉的字符串中)。但是现在硬引号和软引号之间有什么区别?在什么情况下哪个更好?不同语言的引号有什么区别吗?会影响速度吗?如果可能的话,请提供完整而详细的答案,因为这可能对初学者也有很好的帮助。谢谢!
1 回答
这个话题不能以与语言无关的方式来讨论,因为许多语言为这两种引用分配了不同的语义。
在某些语言中,这两种引用风格的含义完全不同:在 C 语言家族中,字符串用双引号括起来,而字符用单引号括起来;在 Postgres 中,字符串用单引号括起来,而双引号转义标识符。在这些语言中,您别无选择,必须使用正确的引号。
在其他语言中,两者之间没有语义差异:Python 不区分这两种风格。在这种情况下,选择一种风格而不是另一种风格并坚持下去可能是值得的,但你喜欢哪一种并不重要;选择一个约定而不是随机使用这两种样式的原因是,它将使您免于将来出现不匹配的引号。选择避免反斜杠的引用样式也可能有(非常轻微的)性能优势,因为它们的处理将(非常轻微地)比字符串中的非特殊字符更昂贵。
在另一个语言家族中,单引号中的字符串不被解析为变量插值,而变量引用被替换为双引号字符串。即使在这些语言中,还有更多不同的风格:例如,bash
不对单引号字符串执行任何解析,这意味着您甚至不能在此处用反斜杠引用文字单引号 ('foo\'bar'
是一个错误;您需要'foo'\''bar'
包含字面单引号)。
在对单引号字符串不执行任何类型转义的语言中,这些将是性能最佳的字符串文字类型。在开始引号之后,解析器只寻找结束引号(可以很好地优化),而不关心字符串的实际内容。
在检查字符串内容的语言中,性能将与语法复杂度成正比。至少必须扫描字符串是否出现任何特殊字符,如果有,则需要对其进行处理(例如,反斜杠可能只跳过下一个字符,但解析器可能还需要检查它之后的几个字符, 如果语法允许像\0x##
) 这样的序列。
如果语言允许在字符串中进行变量插值,其性能取决于具体的实现。解析字符串中的变量引用"foo $var bar"
可能是一个复杂的过程,但另一方面'foo '.$var.' bar'
涉及到两个字符串连接,连接也是一个昂贵的过程——每个连接都需要分配一个新的字符串并将两个操作数复制到其中;对于长字符串,这可能会变得非常昂贵。特定语言的实现可能会更好地优化以解析和替换插值字符串中的变量,而另一种实现可能更好地优化多个字符串的串联(例如,通过使用像绳索这样的结构内部)。尽管如此,这两种作曲风格的表现不太可能有很大不同。