Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP] Pierwszeństwo operatorów, Dodawanie i konkatenacja
vonski
post 13.02.2012, 13:32:17
Post #1





Grupa: Zarejestrowani
Postów: 292
Pomógł: 89
Dołączył: 27.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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.


--------------------
Zend Certified Engineer | Microsoft Certified Professional: Programming in HTML5 with JavaScript & CSS3 | Blog
Go to the top of the page
+Quote Post
kefirek
post 13.02.2012, 13:51:55
Post #2





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

Ostrzeżenie: (0%)
-----


  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'

Ten post edytował kefirek 13.02.2012, 13:52:48
Go to the top of the page
+Quote Post
rocktech.pl
post 13.02.2012, 13:59:58
Post #3





Grupa: Zarejestrowani
Postów: 587
Pomógł: 131
Dołączył: 8.02.2010

Ostrzeżenie: (0%)
-----


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 | + - .

Ten post edytował rocktech.pl 13.02.2012, 14:01:57


--------------------
Despite the tons of examples and docs, mod_rewrite is voodoo. Damned cool voodoo, but still voodoo. --Brian Moore

I never go looking for a sucker. I look for a Champion and make a sucker of of him. --Amarillo Slim


Home-made : js-gui-classes | Accordion | Tabs | Carousel / php-sms-classes | Obsługa bramki SMS MultiInfo | Obsługa bramki SMS Mobiltek
Go to the top of the page
+Quote Post
vonski
post 13.02.2012, 14:05:20
Post #4





Grupa: Zarejestrowani
Postów: 292
Pomógł: 89
Dołączył: 27.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


@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 ).


--------------------
Zend Certified Engineer | Microsoft Certified Professional: Programming in HTML5 with JavaScript & CSS3 | Blog
Go to the top of the page
+Quote Post
nospor
post 13.02.2012, 14:16:57
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
vonski
post 13.02.2012, 14:22:12
Post #6





Grupa: Zarejestrowani
Postów: 292
Pomógł: 89
Dołączył: 27.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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


--------------------
Zend Certified Engineer | Microsoft Certified Professional: Programming in HTML5 with JavaScript & CSS3 | Blog
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 18.07.2025 - 04:36