Operatorföreträde: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
(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...')
 
 
(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]]
|}


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).
=== Exempel ===


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.
==== '''Exempel #1 Associativitet''' ====


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


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 den implicita operatorföreträdet och associativiteten.
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 omgivande kod.  


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.
==== Exempel #2 Odefinierad utvärderingsordning ====
<?php


=== Operatorföreträde ===
$a = 1; echo $a + $a++; // kan skriva ut antingen 2 eller 3
Associativitet Operatorer Ytterligare Information
 
(n/a) clone new clone och new
$i = 1;  $array[$i] = $i++; // kan sätta antingen index 1 eller 2
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
?>


==== Exempel #3 +, - och . har samma företräde (före PHP 8.0.0) ====
<?php
<?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;
$x = 4; // denna rad kan resultera i oväntad utskrift:
$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
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): 


<?php
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: 
$a = 1;
echo $a + $a++; // kan skriva ut antingen 2 eller 3


$i = 1;
echo "x minus one equals " . ($x-1) . ", eller så hoppas jag\n";  
$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.
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 ==
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.


{| 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) 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