<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.operators.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'it',
  ),
  'this' => 
  array (
    0 => 'language.operators.precedence.php',
    1 => 'Precedenza degli operatori',
    2 => 'Precedenza degli operatori',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => 'Operatori',
  ),
  'prev' => 
  array (
    0 => 'language.operators.php',
    1 => 'Operatori',
  ),
  'next' => 
  array (
    0 => 'language.operators.arithmetic.php',
    1 => 'Operatori aritmetici',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'it',
    'path' => 'language/operators/precedence.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.operators.precedence" class="sect1">
 <h2 class="title">Precedenza degli operatori</h2>
 <p class="para">
  La precedenza di un operatore specifica come esso tenga legate assieme &quot;strettamente&quot; due
  espressioni. Per esempio, nell&#039;espressione <code class="literal">1 +
  5 * 3</code>, la risposta è <code class="literal">16</code> e non
  <code class="literal">18</code> perché l&#039;operatore di moltiplicazione (&quot;*&quot;)
  ha una precedenza più alta rispetto all&#039;operatore di addizione (&quot;+&quot;).
  Le parentesi possono essere usate per forzare la precedenza, se necessario. Per
  esempio: <code class="literal">(1 + 5) * 3</code> viene valutata
  <code class="literal">18</code>.
 </p>
 <p class="para">
  Quando gli operatori hanno precedenza identica, la loro associatività decide
  come gli operatori sono raggruppati. Per esempio &quot;-&quot; è associativo a sinistra, quindi
  <code class="literal">1 - 2 - 3</code> è raggruppato come <code class="literal">(1 - 2) - 3</code>
  e valutato come <code class="literal">-4</code>. D&#039;altra parte &quot;=&quot; è
  associativo a destra, quindi <code class="literal">$a = $b = $c</code> è raggruppato come
  <code class="literal">$a = ($b = $c)</code>.
 </p>
 <p class="para">
  Operatori di uguale precedenza che non sono associativi non possono essere usati
  vicini l&#039;uno all&#039;altro, per esempio <code class="literal">1 &lt; 2 &gt; 1</code> è
  illegale in PHP. D&#039;altra parte l&#039;espressione <code class="literal">1 &lt;= 1 == 1</code>
  è legale, perchè l&#039;operatore <code class="literal">==</code> ha una minore
  precedenza dell&#039;operatore <code class="literal">&lt;=</code>.
 </p>
 <p class="para">
  L&#039;associatività è significativa solo per gli operatori binari (e ternari).
  Gli operatori unari sono prefisso o suffisso, quindi questa nozione non è applicabile.
  Ad esempio <code class="literal">!!$a</code> può essere raggruppato solo come <code class="literal">!(!$a)</code>.
 </p>
 <p class="para">
  L&#039;uso delle parentesi, anche quando non strettamente necessario, può spesso aumentare
  la leggibilità del codice rendendo il raggruppamento esplicito piuttosto che fare affidamento
  sulla precedenza e sull&#039;associatività implicite degli operatori.
 </p>
 <p class="para">
  La seguente tabella fornisce una lista della precedenza degli operatori con gli
  operatori a più alta precedenza elencati prima. Gli operatori presenti nella medesima linea
  hanno uguale precedenza, in questi casi la loro associativià decide il raggruppamento.
  <table class="doctable table">
   <caption><strong>Precedenza degli operatori</strong></caption>
   
    <thead>
     <tr>
      <th>Associatività</th>
      <th>Operatori</th>
      <th>Informazioni aggiuntive</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>(n/a)</td>
      <td>
       <code class="literal">clone</code>
       <code class="literal">new</code>
      </td>
      <td><a href="language.oop5.cloning.php" class="link">clone</a> e <a href="language.oop5.basic.php#language.oop5.basic.new" class="link">new</a></td>
     </tr>

     <tr>
      <td>destra</td>
      <td><code class="literal">**</code></td>
      <td><a href="language.operators.arithmetic.php" class="link">operatori aritmetici</a></td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td>
       <code class="literal">+</code> 
       <code class="literal">-</code> 
       <code class="literal">++</code> 
       <code class="literal">--</code> 
       <code class="literal">~</code> 
       <code class="literal">(int)</code> 
       <code class="literal">(float)</code> 
       <code class="literal">(string)</code> 
       <code class="literal">(array)</code>
       <code class="literal">(object)</code> 
       <code class="literal">(bool)</code> 
       <code class="literal">@</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">aritmetici</a> (unari <code class="literal">+</code> e <code class="literal">-</code>),
       <a href="language.operators.increment.php" class="link">incremento/decremento</a>,
       <a href="language.operators.bitwise.php" class="link">bitwise</a>,
       <a href="language.types.type-juggling.php#language.types.typecasting" class="link">casting del tipo</a> e
       <a href="language.operators.errorcontrol.php" class="link">controllo dell&#039;errore</a>
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td><code class="literal">instanceof</code></td>
      <td>
       <a href="language.operators.type.php" class="link">tipo</a>
      </td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td><code class="literal">!</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">logici</a>
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td>
       <code class="literal">*</code>
       <code class="literal">/</code>
       <code class="literal">%</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">aritmetici</a>
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td>
       <code class="literal">+</code> 
       <code class="literal">-</code> 
       <code class="literal">.</code>
      </td>
      <td>
       <a href="language.operators.arithmetic.php" class="link">aritmetici</a> (binari <code class="literal">+</code> e <code class="literal">-</code>),
       <a href="language.operators.array.php" class="link">array</a> e
       <a href="language.operators.string.php" class="link">stringhe</a> (<code class="literal">.</code> prima di PHP 8.0.0)
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td>
       <code class="literal">&lt;&lt;</code> 
       <code class="literal">&gt;&gt;</code>
      </td>
      <td>
       <a href="language.operators.bitwise.php" class="link">bit</a>
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td><code class="literal">.</code></td>
      <td>
       <a href="language.operators.string.php" class="link">stringhe</a> (a partire da PHP 8.0.0)
      </td>
     </tr>

     <tr>
      <td>non associativi</td>
      <td>
       <code class="literal">&lt;</code> 
       <code class="literal">&lt;=</code> 
       <code class="literal">&gt;</code> 
       <code class="literal">&gt;=</code>
      </td>
      <td>
       <a href="language.operators.comparison.php" class="link">confronto</a>
      </td>
     </tr>

     <tr>
      <td>non associativi</td>
      <td>
       <code class="literal">==</code>
       <code class="literal">!=</code> 
       <code class="literal">===</code> 
       <code class="literal">!==</code> 
       <code class="literal">&lt;&gt;</code>
       <code class="literal">&lt;=&gt;</code>
      </td>
      <td>
       <a href="language.operators.comparison.php" class="link">operatori di confronto</a>
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td><code class="literal">&amp;</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">operatori sui bit</a> e
       <a href="language.references.php" class="link">riferimenti</a></td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td><code class="literal">^</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">operatori sui bit</a>
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td><code class="literal">|</code></td>
      <td>
       <a href="language.operators.bitwise.php" class="link">operatori sui bit</a>
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td><code class="literal">&amp;&amp;</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">operatori logici</a>
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td><code class="literal">||</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">operatori logici</a>
      </td>
     </tr>

     <tr>
      <td>destra</td>
      <td><code class="literal">??</code></td>
      <td>
       <a href="language.operators.comparison.php#language.operators.comparison.coalesce" class="link">null coalescing</a>
      </td>
     </tr>

     <tr>
      <td>non associativi</td>
      <td><code class="literal">? :</code></td>
      <td>
       <a href="language.operators.comparison.php#language.operators.comparison.ternary" class="link">ternari</a>
       (associativi a sinistra prima di PHP 8.0.0)
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td>
       <code class="literal">=</code> 
       <code class="literal">+=</code> 
       <code class="literal">-=</code> 
       <code class="literal">*=</code> 
       <code class="literal">**=</code> 
       <code class="literal">/=</code> 
       <code class="literal">.=</code> 
       <code class="literal">%=</code> 
       <code class="literal">&amp;=</code> 
       <code class="literal">|=</code> 
       <code class="literal">^=</code> 
       <code class="literal">&lt;&lt;=</code> 
       <code class="literal">&gt;&gt;=</code>
       <code class="literal">??=</code>
      </td>
      <td>
       <a href="language.operators.assignment.php" class="link">operatori di assegnazione</a>
      </td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td><code class="literal">yield from</code></td>
      <td>
       <a href="language.generators.syntax.php#control-structures.yield.from" class="link">yield from</a>
      </td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td><code class="literal">yield</code></td>
      <td>
       <a href="language.generators.syntax.php#control-structures.yield" class="link">yield</a>
      </td>
     </tr>

     <tr>
      <td>(n/a)</td>
      <td><code class="literal">print</code></td>
      <td><span class="function"><a href="function.print.php" class="function">print</a></span></td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td><code class="literal">and</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">operatori logici</a>
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td><code class="literal">xor</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">operatori logici</a>
      </td>
     </tr>

     <tr>
      <td>sinistra</td>
      <td><code class="literal">or</code></td>
      <td>
       <a href="language.operators.logical.php" class="link">operatori logici</a>
      </td>
     </tr>

    </tbody>
   
  </table>

 </p>
 <p class="para">
  <div class="example" id="example-1">
   <p><strong>Example #1 Associatività</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">3 </span><span style="color: #007700">* </span><span style="color: #0000BB">3 </span><span style="color: #007700">% </span><span style="color: #0000BB">5</span><span style="color: #007700">; </span><span style="color: #FF8000">// (3 * 3) % 5 = 4<br />// l'associatività dell'operatore ternario differisce da quella di C/C++<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">true </span><span style="color: #007700">? </span><span style="color: #0000BB">0 </span><span style="color: #007700">: </span><span style="color: #0000BB">true </span><span style="color: #007700">? </span><span style="color: #0000BB">1 </span><span style="color: #007700">: </span><span style="color: #0000BB">2</span><span style="color: #007700">; </span><span style="color: #FF8000">// (true ? 0 : true) ? 1 : 2 = 2 (prima di PHP 8.0.0)<br /><br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= </span><span style="color: #0000BB">$b </span><span style="color: #007700">+= </span><span style="color: #0000BB">3</span><span style="color: #007700">; </span><span style="color: #FF8000">// $a = ($b += 3) -&gt; $a = 5, $b = 5<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  </p>
 <p class="para">
  La precedenza e l&#039;associatività dell&#039;operatore determinano solo come le espressioni
  sono raggruppate, esse non specificano un ordine di valutazione. PHP non
  specifica (nel caso generale) in quale ordine un&#039;espressione è valutata
  e un codice che presuppone uno specifico ordine di valutazione dovrebbe essere evitato,
  perchè il comportamento può cambiare tra le versioni di PHP o in base al
  codice circostante.
  <div class="example" id="example-2">
   <p><strong>Example #2 Ordine di valutazione indefinito</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$a </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">+ </span><span style="color: #0000BB">$a</span><span style="color: #007700">++; </span><span style="color: #FF8000">// può stampare 2 o 3<br /><br /></span><span style="color: #0000BB">$i </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$array</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">] = </span><span style="color: #0000BB">$i</span><span style="color: #007700">++; </span><span style="color: #FF8000">// può impostare l'indice 1 o 2<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
  <div class="example" id="example-3">
   <p><strong>Example #3 <code class="literal">+</code>, <code class="literal">-</code> e <code class="literal">.</code> hanno la stessa precedenza (prima di PHP 8.0.0)</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$x </span><span style="color: #007700">= </span><span style="color: #0000BB">4</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// questa linea potrebbe causare un risultato inaspettato:<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x minus one equals " </span><span style="color: #007700">. </span><span style="color: #0000BB">$x</span><span style="color: #007700">-</span><span style="color: #0000BB">1 </span><span style="color: #007700">. </span><span style="color: #DD0000">", or so I hope\n"</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// perché è valutata come questa linea (prima di PHP 8.0.0):<br /></span><span style="color: #007700">echo ((</span><span style="color: #DD0000">"x minus one equals " </span><span style="color: #007700">. </span><span style="color: #0000BB">$x</span><span style="color: #007700">) - </span><span style="color: #0000BB">1</span><span style="color: #007700">) . </span><span style="color: #DD0000">", or so I hope\n"</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// la precedenza desiderata può essere forzata usando le parentesi:<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"x minus one equals " </span><span style="color: #007700">. (</span><span style="color: #0000BB">$x</span><span style="color: #007700">-</span><span style="color: #0000BB">1</span><span style="color: #007700">) . </span><span style="color: #DD0000">", or so I hope\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

   <div class="example-contents"><p>Il precedente esempio visualizzerà:</p></div>
   <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
-1, or so I hope
-1, or so I hope
x minus one equals 3, or so I hope
</pre></div>
   </div>
  </div>
 </p>
 <blockquote class="note"><p><strong class="note">Nota</strong>: 
  <p class="para">
   Sebbene <code class="literal">=</code> abbia una precedenza minore rispetto
   alla maggior parte degli altri operatori, PHP permette comunque espressioni
   simili alla seguente: <code class="literal">if (!$a = foo())</code>,
   in questo caso l&#039;output di <code class="literal">foo()</code> viene
   inserito in <var class="varname">$a</var>.
  </p>
 </p></blockquote>
 <div class="sect2">
  <h3 class="title">Log delle modifiche</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Versione</th>
      <th>Descrizione</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
      <td>8.0.0</td>
      <td>
       La concatenazione delle stringhe (<code class="literal">.</code>) ora ha una precedenza inferiore rispetto
       all&#039;addizione/sottrazione aritmetica (<code class="literal">+</code> e <code class="literal">-</code>) e
       lo spostamento bit a bit a sinistra/destra (<code class="literal">&lt;&lt;</code> e <code class="literal">&gt;&gt;</code>);
       precedentemente aveva la stessa precedenza di <code class="literal">+</code> e <code class="literal">-</code>
       e una precedenza superiore a <code class="literal">&lt;&lt;</code> e <code class="literal">&gt;&gt;</code>.
      </td>
     </tr>

     <tr>
      <td>8.0.0</td>
      <td>
       L&#039;operatore ternario (<code class="literal">? :</code>) ora è non-associativo;
       precedentemente era associativo a sinistra.
      </td>
     </tr>

     <tr>
      <td>7.4.0</td>
      <td>
       Fare affidamento sulla precedenza della concatenazione di stringhe (<code class="literal">.</code>) rispetto all&#039;
       addizione/sottrazione aritmetica (<code class="literal">+</code> o <code class="literal">-</code>) o
       lo spostamento bit a bit a sinistra/destra (<code class="literal">&lt;&lt;</code> o <code class="literal">&gt;&gt;</code>),
       ovvero utilizzarli insieme in un&#039;espressione senza parentesi, è deprecato.
      </td>
     </tr>

     <tr>
      <td>7.4.0</td>
      <td>
       Fare affidamento sull&#039;associatività a sinistra dell&#039;operatore ternario (<code class="literal">? :</code>),
       ovvero annidare più operatori ternari senza parentesi, è deprecato.
      </td>
     </tr>

    </tbody>
   
  </table>

 </div>
</div><?php manual_footer($setup); ?>