web-dev-qa-db-ja.com

1 ... 1が10.1と評価されるのはなぜですか?

3v4lからのちょっとしたPHPスニペットに直面しました: https://3v4l.org/jmrZB

echo 1...1; //10.1

そして、その結果を説明する方法がわからないのではないかと思います。なぜこれがまったく有効と見なされるのですか?

168
Gino Pane

PHPでは、ドット(.)には2つの役割があります。

  1. 10進数として、実数の一部である場合、例えば1.1。整数部と小数部は、実数ではオプションですが、同じ時間ではオプションではありません。これは、1..1の両方がPHPの有効な実数であるが、.が数値ではないことを意味します。
  2. 文字列連結演算子 として。この演算子は、2つの文字列部分式をより大きな式に接続します。大きな式の値は、部分式の文字列値の連結です。文字列ではない部分式は、連結の前に文字列に変換されます。
    例えば。 1 . 1'1' . '1'と同じであり、その値はストリング'11'です。

1...1は、1. . .1として解析されます。上記によると、1..1は実数(1.00.1)であり、中点(.)は文字列連結演算子です。

数値を文字列に変換するとき、PHPはこの操作に必要な最小文字数を使用します。実数に整数部分のみがある場合は、小数点と小数なしで整数として数値を表します。

これが1. . .1'1' . '0.1'と同じであり、式の最終値が10.1である理由です。

なぜ1...1がこのように解析されるのですか?

パーサーは、式を左から右に読み取ります。 1は、そこから数字が始まることを伝えます。 1.は有効な実数ですが、1..は有効ではありません。 1.を数値として保持し、次のドットは連結演算子です。次の.は、数字が続き、別の実数(.1)の始まりです。

全体として、1...11. . .1と同じです。

222
axiac

1...11および0.1)として解釈されるため、10.1を取得します

63

中括弧を適用すると、明確になります。

(1.) . (.1)

  • 1.1として解釈されます
  • .は文字列です連結
  • .10.1として解釈されます

これはすべて文字列に入れられる10.1文字列としてです。

var_dump(1...1) yieldsstring(4) "10.1"

45
Polygnome

異なる操作。

1. <?php echo 1.1; ?> // gives simple 1.1
2. <?php echo 1...1; ?> // gives 10.1
3. <?php echo 1..'1'; ?> // gives 11
4. <?php var_dump(1.); ?> // gives 1
5. <?php var_dump(.1); ?> // gives 0.1

今、私たちの奇妙な操作

echo 1...1 

4と5の連結として扱われ、10.1になります

22
Talha Abrar