Im letzten »Linux Magazin« war ein interessanter Leserbrief. Es ging um einen sehr nervtötenden oft auftretetenden und dann sehr heimlich arbeitenden Bug. Ich rede von der Verwechslung einer Definition = und eines Vergleichs == in If-Anweisungen. Das passiert mir selber in einigen Sprache wie PHP und C auch oft. Vorallem, wenn ich zuvor Tagelang in Delphi programmiert hatte.
Dort ist eine Definition := und ein Vergleich =. Also fast genau andersrum. Nur das bei PHP und C beim Verwechseln sich ein böser Fehler einschleicht. Der Debuger bzw. Interpreter geht einfach über den Fehler hinweg und nimmt ihn als Definition.
Richtig:
if ($bar == 'foo') {
echo 'foobar';
}
Falsch:
if ($bar = 'foo') {
echo 'foobar';
}
Wurde aber Vergleich mit Defintion verwechselt, dann wird das echo immer ausgeführt und nach dem If-Block ist immer $bar == ‘foo’.
Um dieses Problem zu vermeiden kann man einen Trick anwenden, der zumindest beim Vergleich mit Konstanten hilft.
Abhilfe:
if ('foo' == $bar) {
echo 'foobar';
}
Man stellt die Konstante auf die linke Seite der If-Anweisung. Somit wird der Interpreter bzw. Debugger anhalten und bemängeln, dass man der linken Seite (also ‘foo’) nichts zuweisen kann.
Wenn ihr vielleicht noch weitere Programmiertipps habt, dann schickt Sie mir per E-Mail oder schreibt Sie in die Kommentare.

7 Kommentare
Weiterer Programmier-”Tipp”:
Man schaue sich einmal folgenden C++ Code an:
int i = 1;
i = i++ + i++;
Frage: Was ist der Wert von i ?
Antwort: http://www.research.att.com/~bs/bs_faq2.html#evaluation-order
if ($foo = ‘bar’){ … } dies wäre in c# nicht möglich. Der Compiler würde meckern das man einen string nicht zu bool konvertieren kann.
Was lernen wir daraus?
Schreibt halt in einer anständigen Sprache!
Grüße sharkx
@sharkx: Wer schon den Zeigefinger hebt, sollte dann wenigstens auch Java nennen, das schon seit jeher in diesem Fall einen Compiler-Fehler anzeigt.
Interessanterweise findet sich auch im aktuellen Java-Magazin ein Hinweis auf dieses Problem, allerdings mit der Anmerkung, dass es bei Java (und eben auch bei C#) völlig egal ist, eben weil der Compiler es nicht zulässt, wie sharkx schon sagte.
Olaf, wenn ich mehr mit Java zu tun hätte, wäre es mir auch sicher in den Sinn gekommen dieses zu nennen. Leider habe ich recht wenig damit am Hut und so kam es doch voll und ganz in Vergessenheit
Ich finde es viel störender wenn man in einer Sprache Variablen nicht deklarieren kann - es nicht zu müssen ist ja manchmal in Ordnung - aber ärgerlich weil durch autovivification Tippfehler bei Variablennamen nicht auffallen.
Implizites casting wenn man z.B. (42 == ‘42′) macht, finde ich auch eher nützlich als problematisch.
Das mit der Zuweisung anstatt Vergleich ist aber tatsächlich ärgerlich. ‘:=’ als Zuweisungsoperator würde mir auch besser gefallen als das einfache ‘=’.
Was man halt gewohnt ist gefällt einem besser. Bei mir ist das = für Zuweisungen und == für Vergleiche.
Grundsätzlich finde ich es am coolsten wie es im Apple Skripteditor gelöst ist. Zuweisungen mit
Set foo to “bar”
Vergleiche mit =. Sogar ? ist möglich. Windows Benutzer können das Ungleichzeichen nicht mal eingeben.
Andere Editoren sollten sich auch ein Beispiel daran nehmen dass der Skripteditor Kodierrichtlinien teilweise überflüssig werden lässt. Der Skripteditor formatiert Zeileneinrückung und Schreibweisen so wie es in den Editoreinstellungen festgelegt ist. Keine Diskussionen mehr ob Tabs oder vier Leerzeichen oder acht Leerzeichen, Parameter untereinander oder hintereinander. Das alles kann jeder Entwickler über seine Editoreinstellungen für sich festlegen und findet auch Anwendung wenn er Kode von anderen bearbeiten muss.
Leider programmiere ich nicht viel in AppleScript.
… auch wenn der post uralt ist Ein kleines Beispiel, was man machen kann.
function getParams() {
if ($UserLoggedIn == true) {
return array(’name’ => ‘pete’, ‘admin’ => true);
}
return false;
}
if ($aParams = getParams()) {
// …
}