Przypisania złożone

2008-09-01 13:58

Przy wprowadzaniu operatorów przypisania typu += czy *= w większości kursów C++ stwierdza się, że ich używanie jest głównie skrótem w stosunku do korzystania ze zwykłego przypisania (=) i odpowiednich operatorów binarnych (jak + czy *). Takie wyjaśnienie jest na początek zupełnie wystarczające, a przy tym łatwe do zrozumienia i co ważniejsze, wydaje się poprawne. I tak faktycznie jest – ono tylko “wydaje się” :)
Później dowiadujemy się bowiem, że sprawa jest nieco bardziej skomplikowana. Zapis typu a += b nie musi zawsze nawet w przybliżeniu odpowiadać “wersji długiej” w postaci a = a + b. Trzeba tu wziąć pod uwagę kilka rzeczy – głównie to, co kryje się pod nazwami a i b:

  • Jeśli na przykład mamy do czynienia z przeciążonymi operatorami = i np. +, to nie oznacza to, że automatycznie dostajemy też przeciążony operator += (i vice versa). Po “skróceniu” dana instrukcja może się więc w ogóle nie skompilować. Dotyczy to oczywiście sytuacji, w których mamy do czynienia z własnymi typami danych.
  • W przypadku, gdy prawa strona przypisania jest bardziej rozbudowana, nieopatrzna zmiana operatora może spowodować niezamierzone błędy. W szczególności np. x = x - y + 2; to nie jest to samo co x -= y + 2;.
  • Nawet dla typów podstawowych skompilowany kod będzie najprawdopodobniej inny w zależności od tego, którego wariantu użyjemy – zwłaszcza w bardziej skomplikowanych przypadkach, gdy ewentualne optymalizacje nie są oczywiste.

Pamiętajmy więc, że operatory typu += są właśnie operatorami, całkowicie odrębnymi od wszystkich innych, nie zaś żadnymi skrótami, jak to się często “dla uproszczenia” mówi.

Tags:
Author: Xion, posted under Programming »



Adding comments is disabled.

Comments are disabled.
 


© 2019 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.