chaos
*nix'ler
Hallo,
ich hab eine mehr oder weniger philosophische Frage zu C und Seiteneffekten.
Dazu erstmal aus dem ISO-C-90-Standard (bzw. dem ANSI-Entwurf von diesem) die Definition von Seiteneffekt:
Also ist klar, dass bei
auch die zweite Zeile einen Seiteneffekt hat (Zugriff auf die volatile Variable hat einen Seiteneffekt, der Rest dient zur Verwirrung bzw. Vorbereitung der nächsten Frage).
Wie schaut es nun aber aus, wenn x nicht volatile ist?
Also hat bei
die zweite Zeile einen Seiteneffekt, oder nicht?
Also ist das Zuweisen eines Wertes an eine Variable zwangsläufig eine Modifikation (d.h. Seiteneffekt) der Variable, oder nicht?
Hat bei
die zweite Zeile einen Seitteneffekt?
Oder wie sieht es gar mit
aus?
Gut bei dem Beispiel könnte man sagen dass der Compiler für den Rückgabewert von myzero eine Variable anlegt und dieser einen Wert zuweist (modifiziert), also ein Seiteneffekt entsteht?
Und zuletzt noch:
Ist zur Compilezeit entscheidbar, ob ein Funktionsaufruf von globalzero() einen Seiteneffekt hat, oder sieht man die Zuweisung als Modifikation?
ciao
chaos
PS: Ich finde inzwischen nach etwas längerer Überlegung die Sichtweise der CPU als zustandsmaschine und evtl. geänderten Registerinhalten als Begründung für einen Seiteneffekt ganz sympatisch.
--------
[1]
Unter der Annahme, dass bei x=0 wohl bei den meisten Rechnerarchitekturen und Compilern die Integeraddition und anschließende Subtraktion noch gut geht, d.h. ohne Überlauf o.ä. und seltsamen nichtdefiniertem Verhalten aufgrund von freizügiger Undefivend-behavior-Auslegung.
ich hab eine mehr oder weniger philosophische Frage zu C und Seiteneffekten.
Dazu erstmal aus dem ISO-C-90-Standard (bzw. dem ANSI-Entwurf von diesem) die Definition von Seiteneffekt:
Accessing a volatile object, modifying an object, modifying a file, or calling a function that does any of those operations are all side effects.
Also ist klar, dass bei
Code:
volatile int x=0;
x=x;
Wie schaut es nun aber aus, wenn x nicht volatile ist?
Also hat bei
Code:
int x=0;
x=x;
Also ist das Zuweisen eines Wertes an eine Variable zwangsläufig eine Modifikation (d.h. Seiteneffekt) der Variable, oder nicht?
- Zum einen könnte man antworten, dass im Fall, dass der Compiler nicht optimiert, sich die Register der CPU ändern können und dadurch ein Seiteneffekt geschen ist,
- zum anderen könnte man auf Quelltextebene argumentieren, dass die Variable x dadurch ja nicht modifiziert wurde, also kein Seiteneffekt geschehen ist.
Wenn die Antwort "kein Seiteneffekt lautet, dann kann man natürlich weiter gehen/fragen.
Hat bei
Code:
int x=0;
x=x+1-1;
Oder wie sieht es gar mit
Code:
int myzero(void)
{
return 0;
}
int main(void)
{
int x=0;
x=myzero();
}
Gut bei dem Beispiel könnte man sagen dass der Compiler für den Rückgabewert von myzero eine Variable anlegt und dieser einen Wert zuweist (modifiziert), also ein Seiteneffekt entsteht?
Und zuletzt noch:
Code:
int global=0;
void globalzero(void)
{
global=0;
}
ciao
chaos
PS: Ich finde inzwischen nach etwas längerer Überlegung die Sichtweise der CPU als zustandsmaschine und evtl. geänderten Registerinhalten als Begründung für einen Seiteneffekt ganz sympatisch.
--------
[1]
Unter der Annahme, dass bei x=0 wohl bei den meisten Rechnerarchitekturen und Compilern die Integeraddition und anschließende Subtraktion noch gut geht, d.h. ohne Überlauf o.ä. und seltsamen nichtdefiniertem Verhalten aufgrund von freizügiger Undefivend-behavior-Auslegung.