# Why does 1...1 evaluate to 10.1?

The dot (`.`

) has two roles in PHP:

- As decimal digit, when it is part of a real number, e.g.
`1.1`

. Both the integral part and the decimal part are optional on real numbers**but not on the same time**. This means both`1.`

and`.1`

are valid real numbers in PHP but`.`

is not a number. - As the string concatenation operator. This operator connects two string sub-expressions into a larger expression. The value of the larger expression is the concatenation of the string values of the sub-expressions. The sub-expressions that are not strings are converted to strings before concatenation.

E.g.`1 . 1`

is the same as`'1' . '1'`

and its value is the string`'11'`

.

The expression `1...1`

is parsed as `1. . .1`

. According to those said above, `1.`

and `.1`

are real numbers (`1.0`

and `0.1`

) and the middle dot (`.`

) is the string concatenation operator.

When converts numbers to strings, PHP uses the minimum amount of characters required for this operation. If a real number has only integral part then it represents the number as integer, without decimal point and decimals.

This is why `1. . .1`

is the same as `'1' . '0.1'`

and the final value of the expression is `10.1`

.

### Why is `1...1`

parsed this way?

The parser reads the expression from left to right. `1`

tells it a number starts there. `1.`

is a valid real number but `1..`

is not. It keeps `1.`

as a number then the next dot is the concatenation operator. The next `.`

, being followed by a digit, is the beginning of another real number (`.1`

).

All in all, `1...1`

is the same as `1. . .1`

.

Applying braces will make it clear:

`(1.) . (.1)`

`1.`

is interpreted as`1`

`.`

is string*concatenation*`.1`

is interpreted as`0.1`

This all put into a string is `10.1`

*as a string*.

`var_dump(1...1)`

yields`string(4) "10.1"`

Different Operations.

```
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
```

Now, our strange operation

```
echo 1...1
```

is treated as concatenation of no 4 and no 5, resulting in 10.1

Because it's interpreted as `1.`

`.`

`.1`

(`1`

and `0.1`

) therefore you get `10.1`