Operatorföreträde: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
 
(15 mellanliggande sidversioner av samma användare visas inte)
Rad 1: Rad 1:
== 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 ==
== Operatorföreträde ==
<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>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.
Rad 25: Rad 12:
<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>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>
<br>
<br>=== Operatorföreträde ===
=== Operatorföreträde ===
<br>Associativitet Operatorer Ytterligare Information
{| class="wikitable"
<br>(n/a) clone new clone och new
! Associativitet !! Operatorer !! Ytterligare Information
<br>höger ** aritmetik
|-
<br>(n/a) + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ aritmetik (unära + och -), inkrement/dekrement, bitvis, typgjutning och felkontroll
| (n/a) || clone new || [[clone]] och [[new]]
<br>vänster instanceof typ
|-
<br>(n/a) ! logisk
| höger || ** || [[aritmetik]]
<br>vänster * / % aritmetik
|-
<br>vänster + - . aritmetik (binära + och -), array och sträng (. före PHP 8.0.0)
| (n/a) || + - ++ -- ~ (int) (float) (string) (array) (object) (bool) @ || [[aritmetik]] (unär + och -), [[inkrement]]/[[dekrement]], [[bitvis]], [[typgjutning]] och [[felkontroll]]
<br>vänster << >> bitvis
|-
<br>vänster . sträng (från och med PHP 8.0.0)
| vänster || instanceof || [[typ]]
<br>icke-associativ < <= > >= jämförelse
|-
<br>icke-associativ == != === !== <> <=> jämförelse
| (n/a) || ! || [[logisk]]
<br>vänster & bitvis och referenser
|-
<br>vänster ^ bitvis
| vänster || * / % || [[aritmetik]]
<br>vänster | bitvis
|-
<br>vänster && logisk
| vänster || + - . || [[aritmetik]] (binär + och -), array och sträng (. före PHP 8.0.0)
<br>vänster || logisk
|-
<br>höger ?? nullsammanfogning
| vänster || << >> || [[bitvis]]
<br>icke-associativ ? : ternär (vänsterassociativ före PHP 8.0.0)
|-
<br>höger = += -= *= **= /= .= %= &= |= ^= <<= >>= ??= tilldelning
| vänster || . || [[sträng]] (från och med PHP 8.0.0)
<br>(n/a) yield from yield from
|-
<br>(n/a) yield yield
| icke-associativ || < <= > >= || [[jämförelse]]
<br>(n/a) print print
|-
<br>vänster and logisk
| icke-associativ || == != === !== <> <=> || [[jämförelse]]
<br>vänster xor logisk
|-
<br>vänster or logisk
| vänster || & || [[bitvis]] och [[referenser]]
<br>
|-
<br>Exempel #1 Associativitet
| vänster || ^ || [[bitvis]]
<br>
|-
<br><?php
| vänster || | || [[bitvis]]
<br>$a = 3 * 3 % 5; // (3 * 3) % 5 = 4
|-
<br>// ternär operator associativitet skiljer sig från C/C++
| vänster || && || [[logisk]]
<br>$a = true ? 0 : true ? 1 : 2; // (true ? 0 : true) ? 1 : 2 = 2 (före PHP 8.0.0)
|-
<br>
| vänster || || [[logisk]]
<br>$a = 1;
|-
<br>$b = 2;
| höger || ?? || [[nullsammanslagning]]
<br>$a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5
|-
<br>?>
| icke-associativ || ? : || [[ternär]] (vänsterassociativ före PHP 8.0.0)
<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.
|-
<br>
| höger || = += -= *= **= /= .= %= &= |= ^= <<= >>= ??= || [[tilldelning]]
<br>Exempel #2 Odefinierad utvärderingsordning
|-
<br>
| (n/a) || yield from || [[yield from]]
<br><?php
|-
<br>$a = 1;
| (n/a) || yield || [[yield]]
<br>echo $a + $a++; // kan skriva ut antingen 2 eller 3
|-
<br>
| (n/a) || print || [[print]]
<br>$i = 1;
|-
<br>$array[$i] = $i++; // kan sätta antingen index 1 eller 2
| vänster || and || [[logisk]]
<br>?>
|-
<br>Exempel #3 +, - och . har samma företräde (före PHP 8.0.0)
| vänster || xor || [[logisk]]
<br>
|-
<br><?php
| vänster || or || [[logisk]]
<br>$x = 4;
|}
<br>// denna rad kan resultera i oväntad utskrift:
 
<br>echo "x minus one equals " . $x-1 . ", eller så hoppas jag\n";
=== Exempel ===
<br>// eftersom det utvärderas som denna rad (före PHP 8.0.0):
 
<br>echo (("x minus one equals " . $x) - 1) . ", eller så hoppas jag\n";
==== '''Exempel #1 Associativitet''' ====
<br>// den önskade företrädet kan upprätthållas genom att använda parenteser:
 
<br>echo "x minus one equals " . ($x-1) . ", eller så hoppas jag\n";
<?php  
<br>?>
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4 // ternär operator associativitet skiljer sig från C/C++ $a = true ? 0 : true ? 1 : 2;  
<br>Ovanstående exempel kommer att skriva ut:
// (true ? 0 : true) ? 1 : 2 = 2 (före PHP 8.0.0)  
<br>
$a = 1; $b = 2; $a = $b += 3; // $a = ($b += 3) -> $a = 5, $b = 5  
<br>-1, eller så hoppas jag
?>  
<br>-1, eller så hoppas jag
 
<br>x minus one equals 3, eller så hoppas jag
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>Notering:
 
<br>
==== Exempel #2 Odefinierad utvärderingsordning ====
<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.
<?php
<br>
 
<br>Ändringslogg
$a = 1; echo $a + $a++; // kan skriva ut antingen 2 eller 3  
<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 >>.
$i = 1; $array[$i] = $i++; // kan sätta antingen index 1 eller 2
<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>
==== 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 ==
 
{| 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]]
[[Språkreferens]]
[[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) 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

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

PHP Språkreferens