8.6 Instrukcja wyrażeniowa

Każde wyrażenie, a więc grupa leksemów, która posiada wartość, może być traktowana jako samodzielna instrukcja, tzw. instrukcja wyrażeniowa (ang. expression statement). Instrukcja taka jest wykonywana poprzez opracowanie wyrażenia i obliczenie jego wartości. Ta wartość w pewnych sytuacjach może być zignorowana, wtedy zatem instrukcja taka ma sens, jeśli powoduje jakieś skutki uboczne (jeśli nie powoduje żadnych skutków ubocznych, to może być przez kompilator całkowicie zignorowana). Instrukcjami wyrażeniowymi mogą być przypisania, operacje zwiększenia (inkrementacji) lub zmniejszenia (dekrementacji), wywołania funkcji, itd.


P46: wyrins.cpp     Instrukcje wyrażeniowe

      1.  #include <iostream>
      2.  #include <cstdio>
      3.  using namespace std;
      4.  
      5.  int main() {
      6.     int k = 7, m = 8;
      7.     ++k;                
      8.     k+1;                
      9.     k = 5;              
     10.     printf("OK?");      
     11.     k > m ? ++k : --m;  
     12.     new double(3.5);    
     13.  }

W przykładzie powyższym instrukcją wyrażeniową jest instrukcja z linii  (inkrementacja), (przypisanie), (wywołanie funkcji rezultatowej –  printf zwraca int), (selekcja bez przypisania wartości), (utworzenia obiektu bez przypisania wynikowej wartości). Instrukcja z linii  (' k+1') jest też instrukcją wyrażeniową, tyle że nie powodującą żadnych skutków — zostanie ona prawdopodobnie przez kompilator zignorowana (tego typu instrukcja byłaby w Javie nielegalna). Instrukcja z linii nie ma sensu, bo tworzymy zmienną typu double, której adresu nie zapisujemy i nigdy już nie zdołamy jej usunąć, choć będzie całkowicie bezużyteczna. Kompilator nie może jednak takich instrukcji zignorować, bo w zasadzie jest możliwe, że wykonanie konstruktora powoduje jakieś skutki, zajścia których programista ma prawo się spodziewać.

T.R. Werner, 23 lutego 2019; 23:59