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.
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 2022; 19:40