Operatorföreträde: Skillnad mellan sidversioner
Admin (diskussion | bidrag) (Skapade sidan med '== Operatorföreträde == Företrädet för en operator specificerar hur "tätt" den binder samman två uttryck. Till exempel, i uttrycket 1 + 5 * 3, är svaret 16 och inte 18 eftersom multiplikationsoperatorn ("*") har högre företräde än additionsoperatorn ("+"). Parenteser kan användas för att tvinga fram företräde vid behov. Till exempel: (1 + 5) * 3 utvärderas till 18. När operatorer har lika företräde avgör deras associativitet hur operatorerna grupper...') |
Admin (diskussion | bidrag) |
||
Rad 12: | Rad 12: | ||
Följande tabell listar operatorerna i ordning av företräde, med de med högst företräde överst. Operatorer på samma rad har lika företräde, i vilket fall associativiteten avgör grupperingen. | Följande tabell listar operatorerna i ordning av företräde, med de med högst företräde överst. Operatorer på samma rad har lika företräde, i vilket fall associativiteten avgör grupperingen. | ||
=== Operatorföreträde === | == Operatorföreträde == | ||
Associativitet Operatorer Ytterligare Information | <br>Företrädet för en operator specificerar hur "tätt" den binder samman två uttryck. Till exempel, i uttrycket 1 + 5 * 3, är svaret 16 och inte 18 eftersom multiplikationsoperatorn ("*") har högre företräde än additionsoperatorn ("+"). Parenteser kan användas för att tvinga fram företräde vid behov. Till exempel: (1 + 5) * 3 utvärderas till 18. | ||
(n/a) clone new clone och new | <br> | ||
höger ** aritmetik | <br>När operatorer har lika företräde avgör deras associativitet hur operatorerna grupperas. Till exempel är "-" vänsterassociativ, så 1 - 2 - 3 grupperas som (1 - 2) - 3 och utvärderas till -4. "=" å andra sidan är högerassociativ, så $a = $b = $c grupperas som $a = ($b = $c). | ||
(n/a) + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ aritmetik (unära + och -), inkrement/dekrement, bitvis, typgjutning och felkontroll | <br> | ||
vänster instanceof typ | <br>Operatorer med lika företräde som är icke-associativa kan inte användas bredvid varandra, till exempel är 1 < 2 > 1 olagligt i PHP. Uttrycket 1 <= 1 == 1 är däremot lagligt, eftersom ==-operatorn har lägre företräde än <=-operatorn. | ||
(n/a) ! logisk | <br> | ||
vänster * / % aritmetik | <br>Associativitet är endast meningsfull för binära (och ternära) operatorer. Unära operatorer är antingen prefix eller postfix så denna notion är inte tillämplig. Till exempel kan !!$a endast grupperas som !(!$a). | ||
vänster + - . aritmetik (binära + och -), array och sträng (. före PHP 8.0.0) | <br> | ||
vänster << >> bitvis | <br>Användning av parenteser, även när det inte strikt är nödvändigt, kan ofta öka läsbarheten i koden genom att göra grupperingen explicit istället för att förlita sig på den implicita operatorföreträdet och associativiteten. | ||
vänster . sträng (från och med PHP 8.0.0) | <br> | ||
icke-associativ < <= > >= jämförelse | <br>Följande tabell listar operatorerna i ordning av företräde, med de med högst företräde överst. Operatorer på samma rad har lika företräde, i vilket fall associativiteten avgör grupperingen. | ||
icke-associativ == != === !== <> <=> jämförelse | <br> | ||
vänster & bitvis och referenser | <br>=== Operatorföreträde === | ||
vänster ^ bitvis | <br>Associativitet Operatorer Ytterligare Information | ||
vänster | bitvis | <br>(n/a) clone new clone och new | ||
vänster && logisk | <br>höger ** aritmetik | ||
vänster || logisk | <br>(n/a) + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ aritmetik (unära + och -), inkrement/dekrement, bitvis, typgjutning och felkontroll | ||
höger ?? nullsammanfogning | <br>vänster instanceof typ | ||
icke-associativ ? : ternär (vänsterassociativ före PHP 8.0.0) | <br>(n/a) ! logisk | ||
höger = += -= *= **= /= .= %= &= |= ^= <<= >>= ??= tilldelning | <br>vänster * / % aritmetik | ||
(n/a) yield from yield from | <br>vänster + - . aritmetik (binära + och -), array och sträng (. före PHP 8.0.0) | ||
(n/a) yield yield | <br>vänster << >> bitvis | ||
(n/a) print print | <br>vänster . sträng (från och med PHP 8.0.0) | ||
vänster and logisk | <br>icke-associativ < <= > >= jämförelse | ||
vänster xor logisk | <br>icke-associativ == != === !== <> <=> jämförelse | ||
vänster or logisk | <br>vänster & bitvis och referenser | ||
<br>vänster ^ bitvis | |||
Exempel #1 Associativitet | <br>vänster | bitvis | ||
<br>vänster && logisk | |||
<?php | <br>vänster || logisk | ||
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4 | <br>höger ?? nullsammanfogning | ||
// ternär operator associativitet skiljer sig från C/C++ | <br>icke-associativ ? : ternär (vänsterassociativ före PHP 8.0.0) | ||
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2 (före PHP 8.0.0) | <br>höger = += -= *= **= /= .= %= &= |= ^= <<= >>= ??= tilldelning | ||
<br>(n/a) yield from yield from | |||
$a = 1; | <br>(n/a) yield yield | ||
$b = 2; | <br>(n/a) print print | ||
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5 | <br>vänster and logisk | ||
?> | <br>vänster xor logisk | ||
Operatorföreträde och associativitet bestämmer endast hur uttryck grupperas, de specificerar inte en utvärderingsordning. PHP specificerar inte (i allmänhet) i vilken ordning ett uttryck utvärderas och kod som antar en specifik utvärderingsordning bör undvikas, eftersom beteendet kan ändras mellan versioner av PHP eller beroende på omgivande kod. | <br>vänster or logisk | ||
<br> | |||
Exempel #2 Odefinierad utvärderingsordning | <br>Exempel #1 Associativitet | ||
<br> | |||
<?php | <br><?php | ||
$a = 1; | <br>$a = 3 * 3 % 5; // (3 * 3) % 5 = 4 | ||
echo $a + $a++; // kan skriva ut antingen 2 eller 3 | <br>// ternär operator associativitet skiljer sig från C/C++ | ||
<br>$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2 (före PHP 8.0.0) | |||
$i = 1; | <br> | ||
$array[$i] = $i++; // kan sätta antingen index 1 eller 2 | <br>$a = 1; | ||
?> | <br>$b = 2; | ||
Exempel #3 +, - och . har samma företräde (före PHP 8.0.0) | <br>$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5 | ||
<br>?> | |||
<?php | <br>Operatorföreträde och associativitet bestämmer endast hur uttryck grupperas, de specificerar inte en utvärderingsordning. PHP specificerar inte (i allmänhet) i vilken ordning ett uttryck utvärderas och kod som antar en specifik utvärderingsordning bör undvikas, eftersom beteendet kan ändras mellan versioner av PHP eller beroende på omgivande kod. | ||
$x = 4; | <br> | ||
// denna rad kan resultera i oväntad utskrift: | <br>Exempel #2 Odefinierad utvärderingsordning | ||
echo "x minus one equals " . $x-1 . ", eller så hoppas jag\n"; | <br> | ||
// eftersom det utvärderas som denna rad (före PHP 8.0.0): | <br><?php | ||
echo (("x minus one equals " . $x) - 1) . ", eller så hoppas jag\n"; | <br>$a = 1; | ||
// den önskade företrädet kan upprätthållas genom att använda parenteser: | <br>echo $a + $a++; // kan skriva ut antingen 2 eller 3 | ||
echo "x minus one equals " . ($x-1) . ", eller så hoppas jag\n"; | <br> | ||
?> | <br>$i = 1; | ||
Ovanstående exempel kommer att skriva ut: | <br>$array[$i] = $i++; // kan sätta antingen index 1 eller 2 | ||
<br>?> | |||
-1, eller så hoppas jag | <br>Exempel #3 +, - och . har samma företräde (före PHP 8.0.0) | ||
-1, eller så hoppas jag | <br> | ||
x minus one equals 3, eller så hoppas jag | <br><?php | ||
Notering: | <br>$x = 4; | ||
<br>// denna rad kan resultera i oväntad utskrift: | |||
Även om = har lägre företräde än de flesta andra operatorer, tillåter PHP fortfarande uttryck som liknar följande: if (!$a = foo()), i vilket fall foo():s returvärde sätts i $a. | <br>echo "x minus one equals " . $x-1 . ", eller så hoppas jag\n"; | ||
<br>// eftersom det utvärderas som denna rad (före PHP 8.0.0): | |||
Ändringslogg | <br>echo (("x minus one equals " . $x) - 1) . ", eller så hoppas jag\n"; | ||
Version Beskrivning | <br>// den önskade företrädet kan upprätthållas genom att använda parenteser: | ||
8.0.0 Strängsammanfogning (.) har nu lägre företräde än aritmetisk addition/subtraktion (+ och -) och bitvis skift vänster/höger (<< och >>); tidigare hade den samma företräde som + och - och ett högre företräde än << och >>. | <br>echo "x minus one equals " . ($x-1) . ", eller så hoppas jag\n"; | ||
8.0.0 Den ternära operatorn (? :) är nu icke-associativ; tidigare var den vänsterassociativ. | <br>?> | ||
7.4.0 Att förlita sig på företrädet för strängsammanfogning (.) i förhållande till aritmetisk addition/subtraktion (+ eller -) eller bitvis skift vänster/höger (<< eller >>), dvs. att använda dem tillsammans i ett oparanteserat uttryck, är föråldrat. | <br>Ovanstående exempel kommer att skriva ut: | ||
7.4.0 Att förlita sig på vänsterassociativitet av den ternära operatorn (? :), dvs. att nestla flera oparanteserade ternära operatorer, är föråldrat. | <br> | ||
<br>-1, eller så hoppas jag | |||
<br>-1, eller så hoppas jag | |||
<br>x minus one equals 3, eller så hoppas jag | |||
<br>Notering: | |||
<br> | |||
<br>Även om = har lägre företräde än de flesta andra operatorer, tillåter PHP fortfarande uttryck som liknar följande: if (!$a = foo()), i vilket fall foo():s returvärde sätts i $a. | |||
<br> | |||
<br>Ändringslogg | |||
<br>Version Beskrivning | |||
<br>8.0.0 Strängsammanfogning (.) har nu lägre företräde än aritmetisk addition/subtraktion (+ och -) och bitvis skift vänster/höger (<< och >>); tidigare hade den samma företräde som + och - och ett högre företräde än << och >>. | |||
<br>8.0.0 Den ternära operatorn (? :) är nu icke-associativ; tidigare var den vänsterassociativ. | |||
<br>7.4.0 Att förlita sig på företrädet för strängsammanfogning (.) i förhållande till aritmetisk addition/subtraktion (+ eller -) eller bitvis skift vänster/höger (<< eller >>), dvs. att använda dem tillsammans i ett oparanteserat uttryck, är föråldrat. | |||
<br>7.4.0 Att förlita sig på vänsterassociativitet av den ternära operatorn (? :), dvs. att nestla flera oparanteserade ternära operatorer, är föråldrat. | |||
<br> |
Versionen från 15 augusti 2024 kl. 15.32
Operatorföreträde
Företrädet för en operator specificerar hur "tätt" den binder samman två uttryck. Till exempel, i uttrycket 1 + 5 * 3, är svaret 16 och inte 18 eftersom multiplikationsoperatorn ("*") har högre företräde än additionsoperatorn ("+"). Parenteser kan användas för att tvinga fram företräde vid behov. Till exempel: (1 + 5) * 3 utvärderas till 18.
När operatorer har lika företräde avgör deras associativitet hur operatorerna grupperas. Till exempel är "-" vänsterassociativ, så 1 - 2 - 3 grupperas som (1 - 2) - 3 och utvärderas till -4. "=" å andra sidan är högerassociativ, så $a = $b = $c grupperas som $a = ($b = $c).
Operatorer med lika företräde som är icke-associativa kan inte användas bredvid varandra, till exempel är 1 < 2 > 1 olagligt i PHP. Uttrycket 1 <= 1 == 1 är däremot lagligt, eftersom ==-operatorn har lägre företräde än <=-operatorn.
Associativitet är endast meningsfull för binära (och ternära) operatorer. Unära operatorer är antingen prefix eller postfix så denna notion är inte tillämplig. Till exempel kan !!$a endast grupperas som !(!$a).
Användning av parenteser, även när det inte strikt är nödvändigt, kan ofta öka läsbarheten i koden genom att göra grupperingen explicit istället för att förlita sig på den implicita operatorföreträdet och associativiteten.
Följande tabell listar operatorerna i ordning av företräde, med de med högst företräde överst. Operatorer på samma rad har lika företräde, i vilket fall associativiteten avgör grupperingen.
Operatorföreträde
Företrädet för en operator specificerar hur "tätt" den binder samman två uttryck. Till exempel, i uttrycket 1 + 5 * 3, är svaret 16 och inte 18 eftersom multiplikationsoperatorn ("*") har högre företräde än additionsoperatorn ("+"). Parenteser kan användas för att tvinga fram företräde vid behov. Till exempel: (1 + 5) * 3 utvärderas till 18.
När operatorer har lika företräde avgör deras associativitet hur operatorerna grupperas. Till exempel är "-" vänsterassociativ, så 1 - 2 - 3 grupperas som (1 - 2) - 3 och utvärderas till -4. "=" å andra sidan är högerassociativ, så $a = $b = $c grupperas som $a = ($b = $c).
Operatorer med lika företräde som är icke-associativa kan inte användas bredvid varandra, till exempel är 1 < 2 > 1 olagligt i PHP. Uttrycket 1 <= 1 == 1 är däremot lagligt, eftersom ==-operatorn har lägre företräde än <=-operatorn.
Associativitet är endast meningsfull för binära (och ternära) operatorer. Unära operatorer är antingen prefix eller postfix så denna notion är inte tillämplig. Till exempel kan !!$a endast grupperas som !(!$a).
Användning av parenteser, även när det inte strikt är nödvändigt, kan ofta öka läsbarheten i koden genom att göra grupperingen explicit istället för att förlita sig på den implicita operatorföreträdet och associativiteten.
Följande tabell listar operatorerna i ordning av företräde, med de med högst företräde överst. Operatorer på samma rad har lika företräde, i vilket fall associativiteten avgör grupperingen.
=== Operatorföreträde ===
Associativitet Operatorer Ytterligare Information
(n/a) clone new clone och new
höger ** aritmetik
(n/a) + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ aritmetik (unära + och -), inkrement/dekrement, bitvis, typgjutning och felkontroll
vänster instanceof typ
(n/a) ! logisk
vänster * / % aritmetik
vänster + - . aritmetik (binära + och -), array och sträng (. före PHP 8.0.0)
vänster << >> bitvis
vänster . sträng (från och med PHP 8.0.0)
icke-associativ < <= > >= jämförelse
icke-associativ == != === !== <> <=> jämförelse
vänster & bitvis och referenser
vänster ^ bitvis
vänster | bitvis
vänster && logisk
vänster || logisk
höger ?? nullsammanfogning
icke-associativ ? : ternär (vänsterassociativ före PHP 8.0.0)
höger = += -= *= **= /= .= %= &= |= ^= <<= >>= ??= tilldelning
(n/a) yield from yield from
(n/a) yield yield
(n/a) print print
vänster and logisk
vänster xor logisk
vänster or logisk
Exempel #1 Associativitet
<?php
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
// ternär operator associativitet skiljer sig från C/C++
$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2 (före PHP 8.0.0)
$a = 1;
$b = 2;
$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
?>
Operatorföreträde och associativitet bestämmer endast hur uttryck grupperas, de specificerar inte en utvärderingsordning. PHP specificerar inte (i allmänhet) i vilken ordning ett uttryck utvärderas och kod som antar en specifik utvärderingsordning bör undvikas, eftersom beteendet kan ändras mellan versioner av PHP eller beroende på omgivande kod.
Exempel #2 Odefinierad utvärderingsordning
<?php
$a = 1;
echo $a + $a++; // kan skriva ut antingen 2 eller 3
$i = 1;
$array[$i] = $i++; // kan sätta antingen index 1 eller 2
?>
Exempel #3 +, - och . har samma företräde (före PHP 8.0.0)
<?php
$x = 4;
// denna rad kan resultera i oväntad utskrift:
echo "x minus one equals " . $x-1 . ", eller så hoppas jag\n";
// eftersom det utvärderas som denna rad (före PHP 8.0.0):
echo (("x minus one equals " . $x) - 1) . ", eller så hoppas jag\n";
// den önskade företrädet kan upprätthållas genom att använda parenteser:
echo "x minus one equals " . ($x-1) . ", eller så hoppas jag\n";
?>
Ovanstående exempel kommer att skriva ut:
-1, eller så hoppas jag
-1, eller så hoppas jag
x minus one equals 3, eller så hoppas jag
Notering:
Även om = har lägre företräde än de flesta andra operatorer, tillåter PHP fortfarande uttryck som liknar följande: if (!$a = foo()), i vilket fall foo():s returvärde sätts i $a.
Ändringslogg
Version Beskrivning
8.0.0 Strängsammanfogning (.) har nu lägre företräde än aritmetisk addition/subtraktion (+ och -) och bitvis skift vänster/höger (<< och >>); tidigare hade den samma företräde som + och - och ett högre företräde än << och >>.
8.0.0 Den ternära operatorn (? :) är nu icke-associativ; tidigare var den vänsterassociativ.
7.4.0 Att förlita sig på företrädet för strängsammanfogning (.) i förhållande till aritmetisk addition/subtraktion (+ eller -) eller bitvis skift vänster/höger (<< eller >>), dvs. att använda dem tillsammans i ett oparanteserat uttryck, är föråldrat.
7.4.0 Att förlita sig på vänsterassociativitet av den ternära operatorn (? :), dvs. att nestla flera oparanteserade ternära operatorer, är föråldrat.