Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] Pierwszeństwo operatorów
Forum PHP.pl > Forum > Przedszkole
vonski
Witam.
Przerabiam sobie właśnie książeczkę z przykładowymi testami do ZCE i natrafiłem na pewną niejasność.
Jest takie pytnianie:

What will the following script output?

  1. echo 'Testing ' . 1 + 2 . '45';


Prawidłowa odpowiedź to: 245
Zgadza się, z tym że wyjaśnienie już jest dla mnie nie do końca jasne:

The concatenation operator has a higher precenedce than the addition operator. Therefore, PHP will interpret this expression as if it were written ('Testing' . 1) + (2 . '45').

I tutaj mam wątpliwości, bo wg manuala obydwa te operatory mają taki sam priorytet i decyduje kolejność ich występowania w wyrażeniu, czyli PHP chyba interpretuje to w ten sposób:
1) 'Testing ' . 1 => 'Testing 1'
2) 'Testing 1' + 2 => 2
3) 2 . '45' => '245'

Czy może mi ktoś wytłumaczyć o co chodziło autorowi? smile.gif Czy może po prostu aż tak się pomylił?
Z góry dzięki.
kefirek
  1. <?php
  2. echo 'Testing ' . 1 + 2 . '45';
  3. ?>


W tym przypadku do stringa czyli Testing dołączasz 1 ponieważ kropka powoduję łączenie i wychodzi 'Testing 1' potem do tego dodajesz 2 a ze do tekstu nie można dodać to wychodzi 2 i do dwójki dołączasz string 45 to wychodzi 245

tutaj to samo
'Testing ' . 1 => 'Testing 1'

Do Testing za pomocą kropki łączysz 1 i wychodzi Testing 1

tutaj
'Testing 1' + 2 => 2 wychodzi 2 ponieważ 'Testing 1' to nie liczba i dla tego 2

tutaj
2 . '45' => '245' wychodzi 245 ponieważ do 2 łączysz string '45'
rocktech.pl
Cytat(vonski @ 13.02.2012, 13:32:17 ) *
The concatenation operator has a higher precenedce than the addition operator. Therefore, PHP will interpret this expression as if it were written ('Testing' . 1) + (2 . '45').

I tutaj mam wątpliwości, bo wg manuala obydwa te operatory mają taki sam priorytet i decyduje kolejność


When operators have equal precedence, their associativity decides whether they are evaluated starting from the right, or starting from the left ...

Kiedy operatory mają równe pierwszeństwo o ich zespoleniu decyduje czy są ewaluowane od prawej czy od lewej ..

I wedle tabelki:

Zespolenie | Operatory
lewa | + - .
vonski
@kefirek Dzięki za odpowiedź. Dokładnie, właśnie taki jest mój tok rozumowania smile.gif Nie rozumiem natomiast o co chodziło autorowi w wyjaśnieniu, bo jest całkiem inne, mimo że prowadzi do takiej samej odpowiedzi:

"The concatenation operator has a higher precenedce than the addition operator. Therefore, PHP will interpret this expression as if it were written ('Testing' . 1) + (2 . '45')."

Chodzi mi o to, że wg niego to wygląda mniej więcej tak:

'Testing' . 1 => 'Testing 1'
2. '45' => '245'

i dopiero teraz:
'Testing 1' + '245' => 245

Wydaje mi się, że autor się pomylił, ale po pierwsze jest to dla mnie dziwne, bo nie jest to literówka, tylko dość poważny błąd, który w innym przykładzie może być tragiczny w sktukach, a po drugie chce mieć wszystkie wątpliwości rozwiane na 100% smile.gif

Cytat
When operators have equal precedence, their associativity decides whether they are evaluated starting from the right, or starting from the left ...

Kiedy operatory mają równe pierwszeństwo o ich zespoleniu decyduje czy są ewaluowane od prawej czy od lewej ..


No właśnie, czyli można przyjąć chyba, że jest to pomyłka (autora, nie mauala wink.gif ).
nospor
Cytat
bo jest całkiem inne, mimo że prowadzi do takiej samej odpowiedzi
No nie. Nie do takiej samej.

wg, kodu autora wynik to liczba 245.
wg. poprawnego interpretowania to tekst 245
smile.gif
vonski
Cytat(nospor @ 13.02.2012, 14:16:57 ) *
No nie. Nie do takiej samej.

wg, kodu autora wynik to liczba 245.
wg. poprawnego interpretowania to tekst 245
smile.gif


Hehe, no fakt smile.gif Tego nie zauważyłem smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.