Nehmen wir an, ich möchte eine Funktion schreiben, die zwei Zeichenfolgen in C verkettet.
void concat(char s[], char t[]){
int i = 0;
int j = 0;
while (s[i] != '\0'){
i++;
}
while (t[j] != '\0'){
s[i] = t[j];
i++;
j++;
}
s[i] = '\0';
}
Allerdings K & R in ihrem Buch umgesetzt es anders, vor allem mit so viel im Bedingungsteil der while - Schleife wie möglich:
void concat(char s[], char t[]){
int i, j;
i = j = 0;
while (s[i] != '\0') i++;
while ((s[i++]=t[j++]) != '\0');
}
Welcher Weg wird bevorzugt? Ist es empfehlenswert oder nicht empfehlenswert, wie bei K & R Code zu schreiben? Ich glaube, meine Version wäre für andere leichter zu lesen.
programming-practices
coding-style
Richard Smith
quelle
quelle
while (*s++ = *t++);
(Mein C ist sehr verrostet, brauche ich dort Parens, damit der Operator Vorrang hat?). Hat K & R eine neue Version ihres Buches veröffentlicht? Ihr ursprüngliches Buch hatte einen äußerst präzisen und idiomatischen Code.'\0'
vont
(diewhile
Ausgänge zuerst). Dadurch bleibt die resultierendes
Zeichenfolge ohne Abschluss'\0'
(es sei denn, der Speicherort wurde bereits auf Null gesetzt). Der zweite Codeblock erstellt die Kopie des Abschlusses'\0'
vor dem Verlassen derwhile
Schleife.Antworten:
Immer lieber Klarheit als Klugheit. In früheren Jahren war der beste Programmierer der, dessen Code niemand verstehen konnte. "Ich kann seinen Code nicht verstehen, er muss ein Genie sein" , sagten sie. Heutzutage ist der beste Programmierer der, dessen Code jeder verstehen kann. Die Computerzeit ist jetzt billiger als die Zeit des Programmierers.
Also würde ich ohne Zweifel Option A wählen. Und das ist meine endgültige Antwort.
quelle
if (a=b)
die leicht für verwechselt werden kannif (a==b)
.while ((c = fgetc(file)) != EOF)
als erster fällt mir das ein.Die goldene Regel ist, genau wie in Tulains Córdovas Antwort, sicherzustellen, dass verständlicher Code geschrieben wird. Aber ich stimme der Schlussfolgerung nicht zu. Diese goldene Regel bedeutet, Code zu schreiben, den ein typischer Programmierer verstehen kann, der am Ende Ihren Code wartet. Und Sie beurteilen am besten, wer der typische Programmierer ist, der am Ende Ihren Code wartet.
Für die Programmierer, die nicht mit C begonnen haben, ist die erste Version wahrscheinlich aus Gründen, die Sie bereits kennen, einfacher zu verstehen.
Für diejenigen, die mit diesem C-Stil aufgewachsen sind, ist die zweite Version möglicherweise leichter zu verstehen: Für sie ist es ebenso verständlich, was der Code tut, für sie bleiben weniger Fragen, warum er so geschrieben ist, wie er ist, und für sie Wenn weniger vertikaler Raum vorhanden ist, kann mehr Kontext auf dem Bildschirm angezeigt werden.
Sie müssen sich auf Ihren eigenen gesunden Menschenverstand verlassen. Für welche Zielgruppe möchten Sie Ihren Code am einfachsten verständlich machen? Ist dieser Code für eine Firma geschrieben? Das Zielpublikum sind dann wahrscheinlich die anderen Programmierer in diesem Unternehmen. Ist das ein persönliches Hobbyprojekt, an dem niemand außer dir selbst arbeiten wird? Dann sind Sie Ihre eigene Zielgruppe. Möchten Sie diesen Code mit anderen teilen? Dann sind diese anderen Ihre Zielgruppe. Wählen Sie die Version aus, die zu dieser Zielgruppe passt. Leider gibt es keinen bevorzugten Weg, um zu ermutigen.
quelle
BEARBEITEN: Die Zeile
s[i] = '\0';
wurde der ersten Version hinzugefügt und dadurch wie in Variante 1 unten beschrieben korrigiert, sodass dies nicht mehr für die aktuelle Version des Fragencodes gilt.Die zweite Version hat den entscheidenden Vorteil, dass sie korrekt ist , während die erste dies nicht ist - sie beendet die Zielzeichenfolge nicht korrekt mit Null.
Die "Zuweisung in Bedingung" ermöglicht es, das Konzept "jedes Zeichen kopieren, bevor auf das Null-Zeichen geprüft wird" sehr kurz und so auszudrücken , dass die Optimierung für den Compiler etwas einfacher wird, obwohl viele Software-Ingenieure diese Art von Code heutzutage weniger lesbar finden . Wenn Sie darauf bestehen, die erste Version zu verwenden, müssen Sie dies auch tun
quelle
Die Antworten von Tulains Córdova und hvd decken die Klarheits- / Lesbarkeitsaspekte recht gut ab. Lassen Sie mich das Scoping als weiteren Grund für die Zuweisung von Bedingungen anführen . Eine in der Bedingung deklarierte Variable ist nur im Gültigkeitsbereich dieser Anweisung verfügbar. Sie können diese Variable nicht versehentlich später verwenden. Die for- Schleife macht das schon seit Ewigkeiten. Und es ist wichtig genug, dass das kommende C ++ 17 eine ähnliche Syntax für if und switch einführt :
quelle
Nein, es ist ein sehr normaler und normaler C-Stil. Ihr Beispiel ist schlecht, weil es nur eine for-Schleife sein sollte, aber im Allgemeinen ist daran nichts auszusetzen
zum Beispiel (oder mit while).
quelle
!= NULL
.(x != NULL) != 0
. Das ist es doch, was C wirklich überprüft, oder?In den Tagen von K & R
while ((s[i++]=t[j++]) != '\0')
auf den meisten CPUs einem Befehl zugeordnet waren (ich erwarte die Dec VAC).Es Tage
(Ein Hinweis zur Verwendung von geschweiften Klammern - die erste Codemenge nimmt aufgrund von "nicht benötigten" Zeichen mehr Platz ein. Nach
{}
meiner Erfahrung verhindern diese häufig, dass Code, der schlecht vom Compiler zusammengeführt wurde, fehlerhaft platziert wird.) von Werkzeugen erkannt.)In früheren Zeiten hätte die 2. Version des Codes gelesen. (Wenn ich es richtig verstanden habe!)
quelle
Sogar dies überhaupt tun zu können, ist eine sehr schlechte Idee. Es ist umgangssprachlich als "The World's Last Bug" bekannt, wie folgt:
Während Sie wahrscheinlich nicht einen Fehler machen , das ist ganz so streng, ist es sehr leicht versehentlich vermasseln und verursachen eine schwer zu findende Fehler in der Code - Basis. Die meisten modernen Compiler fügen eine Warnung für Zuweisungen innerhalb einer Bedingung ein. Sie sind aus einem bestimmten Grund da, und Sie tun gut daran, sie zu beachten und dieses Konstrukt einfach zu vermeiden.
quelle
CODE_RED = alert
sodass es einen Compilerfehler gab.Beide Stile sind wohlgeformt, korrekt und angemessen. Welche Option besser geeignet ist, hängt weitgehend von den Stilrichtlinien Ihres Unternehmens ab. Moderne IDEs erleichtern die Verwendung beider Stile durch die Verwendung von Live-Syntax-Flusen, die explizit Bereiche hervorheben, die ansonsten zu Verwirrung geführt haben könnten.
Beispielsweise wird der folgende Ausdruck von Netbeans hervorgehoben :
aufgrund "zufälliger Abtretung".
Um Netbeans explizit mitzuteilen, dass "Ja, das wollte ich wirklich ...", kann der Ausdruck in Klammern gesetzt werden.
Letztendlich läuft alles auf Unternehmensrichtlinien und die Verfügbarkeit moderner Tools zur Erleichterung des Entwicklungsprozesses hinaus.
quelle