この質問はしばらくの間私を悩ませてきました。コードでソフトクォートを使用している人がたくさんいます。ただし、ほとんどすべての場所でハードクォートを使用します。場合によっては、ハードクォートの方が適していると思います(PHPで変数を称賛のある文字列に入れる場合など)。しかし、ハードクォートとソフトクォートの違いは何ですか?どのような場合にどちらが良いですか?異なる言語の引用と何か違いはありますか?速度に影響しますか?可能であれば、ソースを使用して完全で詳細な回答を提供してください。これは、初心者のプログラマーにとっても役立つ可能性があるためです。ありがとう!
1 に答える
多くの言語が2種類の引用符に異なるセマンティクスを割り当てるため、このトピックを言語に依存しない方法で説明することはできません。
一部の言語では、2つの引用符のスタイルは根本的に異なることを意味します。C言語ファミリでは、文字列は二重引用符で囲まれ、文字は一重引用符で囲まれます。Postgresでは、文字列は一重引用符で囲まれ、二重引用符は識別子をエスケープします。これらの言語では、選択の余地がなく、正しい種類の引用符を使用する必要があります。
他の言語では、2つの間に意味上の違いはありません。Pythonは2つのスタイルを区別しません。この場合、一方のスタイルを選択してそれを維持することはおそらく価値がありますが、どちらを選択するかは問題ではありません。2つのスタイルをランダムに使用する代わりに規則を選択する理由は、将来、引用符の不一致からあなたを救うためです。また、バックスラッシュを回避する引用符スタイルを選択すると、(非常にわずかな)パフォーマンス上の利点が生じる可能性があります。これは、文字列内の特殊文字以外の文字よりも処理コストが(非常にわずかに)高くなるためです。
さらに別の言語ファミリーでは、一重引用符で囲まれた文字列は変数補間のために解析されませんが、変数参照は二重引用符で囲まれた文字列に置き換えられます。これらの言語の間でも、さらにさまざまなフレーバーがあります。たとえば、一重引用符で囲まれた文字列では解析をbash
実行しません。つまり、リテラルの一重引用符をバックスラッシュで引用することさえできません(エラーです。含めるには'foo\'bar'
必要です。'foo'\''bar'
文字通りの一重引用符)。
一重引用符で囲まれた文字列に対していかなる種類のエスケープも実行しない言語では、それらが最もパフォーマンスの高いタイプの文字列リテラルになります。開始引用符の後、パーサーは終了引用符(かなりうまく最適化できます)のみを探し、文字列の実際の内容には関係しません。
文字列の内容を検査する言語では、パフォーマンスは文法の複雑さに比例して変化します。文字列は、少なくとも特殊文字の出現をスキャンする必要があり、存在する場合は処理する必要があります(たとえば、バックスラッシュは次の文字をスキップするだけですが、パーサーはその後のいくつかの文字を検査する必要がある場合もあります) 、文法が)のようなシーケンスを許可する場合\0x##
。
言語が文字列内の変数補間を許可する場合、そのパフォーマンスは特定の実装によって異なります。文字列内の変数参照の解析"foo $var bar"
は複雑なプロセスになる可能性がありますが、一方で'foo '.$var.' bar'
2つの文字列連結が必要であり、連結もコストのかかるプロセスです。各連結は新しい文字列を割り当て、2つのオペランドをその文字列にコピーする必要があります。これは、長い文字列では非常に高価になる可能性があります。特定の言語の実装は、補間された文字列内の変数を解析および置換するように最適化されている可能性があり、別の実装は、複数の文字列の連結を一緒に最適化するのに適している可能性があります(たとえば、ロープなどの構造を使用することによって)初めの)。それでも、2つの構成スタイルでパフォーマンスが大きく異なる可能性はほとんどありません。