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) |
||
(16 mellanliggande sidversioner av samma användare visas inte) | |||
Rad 1: | Rad 1: | ||
== Operatorföreträde == | == 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. | <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. | ||
<br> | |||
<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). | |||
<br> | |||
<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. | |||
<br> | |||
<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). | |||
<br> | |||
<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. | |||
<br> | |||
<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. | |||
<br> | |||
=== Operatorföreträde === | |||
{| class="wikitable" | |||
! Associativitet !! Operatorer !! Ytterligare Information | |||
|- | |||
| (n/a) || clone new || [[clone]] och [[new]] | |||
|- | |||
| höger || ** || [[aritmetik]] | |||
|- | |||
| (n/a) || + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ || [[aritmetik]] (unär + och -), [[inkrement]]/[[dekrement]], [[bitvis]], [[typgjutning]] och [[felkontroll]] | |||
|- | |||
| vänster || instanceof || [[typ]] | |||
|- | |||
| (n/a) || ! || [[logisk]] | |||
|- | |||
| vänster || * / % || [[aritmetik]] | |||
|- | |||
| vänster || + - . || [[aritmetik]] (binär + 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 || ?? || [[nullsammanslagning]] | |||
|- | |||
| 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 === | |||
==== '''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 | <?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"; | ||
?> | ?> | ||
Ä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. | 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 | == Ändringslogg == | ||
{| class="wikitable" | |||
! Version !! Beskrivning | |||
|- | |||
| 8.0.0 || Strängkonkatenering (.) 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ängkonkatenering (.) i förhållande till aritmetisk addition/subtraktion (+ eller -) eller bitvis skift vänster/höger (<< eller >>), dvs. 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. nysta flera oparanteserade ternära operatorer, är föråldrat. | |||
|} | |||
[[PHP]] | [[PHP]] | ||
[[Språkreferens]] | [[Språkreferens]] | ||
[[Kategori:Php]] | [[Kategori:Php]] |
Nuvarande version från 15 augusti 2024 kl. 15.54
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är + och -), inkrement/dekrement, bitvis, typgjutning och felkontroll |
vänster | instanceof | typ |
(n/a) | ! | logisk |
vänster | * / % | aritmetik |
vänster | + - . | aritmetik (binär + 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 | ?? | nullsammanslagning |
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) | ||
vänster | and | logisk |
vänster | xor | logisk |
vänster | or | logisk |
Exempel
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ängkonkatenering (.) 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ängkonkatenering (.) i förhållande till aritmetisk addition/subtraktion (+ eller -) eller bitvis skift vänster/höger (<< eller >>), dvs. 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. nysta flera oparanteserade ternära operatorer, är föråldrat. |