Operatorföreträde: Skillnad mellan sidversioner

Från Wiki.linux.se
Hoppa till navigering Hoppa till sök
 
(3 mellanliggande sidversioner av samma användare visas inte)
Rad 36: Rad 36:
| icke-associativ || < <= > >= || [[jämförelse]]
| icke-associativ || < <= > >= || [[jämförelse]]
|-
|-
| icke-associativ || == != === !== <> <=> || jämförelse
| icke-associativ || == != === !== <> <=> || [[jämförelse]]
|-
|-
| vänster || & || [[bitvis]] och [[referenser]]
| vänster || & || [[bitvis]] och [[referenser]]
Rad 74: Rad 74:
$a = 3 * 3 % 5; // (3 * 3) % 5 = 4  // ternär operator associativitet skiljer sig från C/C++  $a = true ? 0 : true ? 1 : 2;  
$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)  
// (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 ?>  
$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.     
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
==== Exempel #2 Odefinierad utvärderingsordning ====
 
<?php
<?php


Rad 86: Rad 86:
$i = 1;  $array[$i] = $i++; // kan sätta antingen index 1 eller 2
$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) ====
==== 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:
<?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";  // eftersom det utvärderas som denna rad (före PHP 8.0.0):   
Rad 114: Rad 116:
| 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.
| 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