2008-09-26 7 views
10

Zum BeispielMit Vergleichsoperator außerhalb von conditionals

int f(int a) { 
    ... 
    return a > 10; 
} 

ist, dass akzeptabel angesehen (nicht legal, ich meine, ist es `` guter Code ‚‘), oder sollte es immer in einem bedingten sein, wie dies

int f(int a) { 
    ... 
    if (a > 10) 
     return 1; 
    else 
     return 0; 
} 
+0

Da die Funktion einen int zurückgibt, wäre es besser, den Tertiäroperator zu verwenden: return a> 10? 1: 0 –

+3

Ich denke, Jim bedeutet "ternärer Operator" – ilitirit

Antwort

31

Dies ist absolut akzeptabel! In der Tat, Joel erwähnt dies auf dem neuesten Stackoverflow Podcast. Er sagte, es sei die einzige Sache, die er fast jedem Programmierer zeigen müsse, der bei Fog Creek anfängt.

+2

Als ich herausfand, dass nicht jeder es auf die erste Art macht, war ich verblüfft! Der erste Weg ist so viel lesbarer und prägnanter, während der zweite viel schwieriger zu verstehen ist, weil ein einzelnes, einfaches Konzept vier statt einer Zeile benötigt. –

+0

Wo ich es gelernt habe, wenn du es auf die zweite Art und Weise gemacht hast, hast du Punkte bei Hausaufgaben verloren. Dies war in der Intro-Klasse (Vor-Dur). – hazzen

+0

Vor allem, wenn der Rückgabetyp bool ist. Ich schaudere, wenn ich etwas sehe wie: wenn (a> 1) zurück wahr; sonst Rückgabe false; – Ferruccio

4

Ich sehe nichts falsch damit. Wenn überhaupt, ist es prägnanter und ich denke, die meisten Entwickler mit mäßiger Erfahrung würden es bevorzugen.

2

Die erste ist mir viel vorzuziehen, da es prägnanter ist. (Und es vermeidet mehrere Rücksendungen :)

0

Ich werde in der Regel die ersteren über die letzteren tun.

1

Ich denke, es ist vollkommen akzeptabel, vorausgesetzt, dass Sie sicherstellen, dass Sie einen zusätzlichen Aufwand machen, um die Lesbarkeit zu erhalten. Wie ich sicherstellen würde, dass der Methodenname sehr eindeutig ist und Sie gute Variablennamen verwenden. Die zweite von Ihnen vorgeschlagene Alternative ist meiner Meinung nach fast schlechter, da sie eine Verzweigungsaussage und mehrere Rücksendeanweisungen enthält und diese Dinge die Komplexität der Methode erhöhen und gleichzeitig ihre Lesbarkeit verringern.

37

Es wäre akzeptabel - wenn Ihr Rückgabetyp bool war.

+1

Guter Fang Mark! –

2

Ich würde lieber schreiben bool f(int); und die erste Form als bool ist die boolean Art in C++. Wenn ich wirklich eine int müssen zurückkehren, würde ich so etwas wie

int f(int) { 
    ... 
    const int res = (i>42) ? 1 : 0; 
    return res; 
} 

schreiben würde ich nie verstanden, warum die Leute

if (expr == true) 
    mybool = true ; 
else 
    mybool = false; 

statt der Ebene

mybool = expr; 

Boolesche Algebra schreiben ist ein Werkzeug, das jeder Entwickler instinktiv handhaben kann

Darüber hinaus würde ich lieber ein benanntes temporäres definieren, da einige Debugger nicht sehr gut mit Funktionsrückgabewerten umgehen.

+1

Ich denke, Sie wollten res, nicht 0. –

+0

Der Bool-Typ existiert nicht in C, aber sonst, ja. –

+0

Okay, es existiert in C99 ... Macht nichts! –

6

Der erste Fall ist perfekt gut, weit besser als der zweite, IMHO. Als eine Frage der Lesbarkeit, würde ich persönlich

return (a > 10); 

aber das ist eine kleine nit, und nicht ein jeder würde einig.

+0

Ich stimme nicht zu. Es sieht so aus, als ob Sie denken, dass die Rückkehr eine Funktion ist, die aufgerufen wird. – Trent

+2

Nur wenn Sie beim Aufruf von Funktionen Leerzeichen vor die Klammern setzen, was ich nicht tue. –

13
return a > 10 ? 1 : 0; 

... macht mehr Sinn, weil Sie ein Int, nicht ein Bool zurückgeben.

1

Nicht nur ist diese Syntax 100% akzeptabel, Sie sollten auch frei Boolesche Ausdrücke außerhalb von if -Anweisungen verwenden, d. H. int x = i && (j || k); (oder solche Werte zurückgeben).

1

Ich denke, ein Teil davon hat mit dem Stil und der Kultur der Sprache zu tun. Das erste Beispiel, das Sie geschrieben haben, ist das, was von einem erfahrenen C-Programmierer erwartet würde. Sie würden sich viel lieber strangulieren, als einen unnötigen Block von Aussagen zu machen.

Ich denke, es ist durchaus akzeptabel, wenn die Sprache es erlaubt und die Nutzung ist ein Teil des Paradigmas dieser Sprache

1

Ich habe gerade versucht, drei verschiedene Varianten mit GCC:

int one(int x) { return (x > 42) ? 1 : 0; } 
int two(int x) { return x > 42; } 
int thr(int x) { if (x > 42) return 1; else return 0; } 

Sobald Sie Aktivieren Sie einige Optimierung, der generierte Code für alle von ihnen ist derselbe. Sie sollten also die Variante verwenden, die am einfachsten zu lesen ist.