Sind die Semikola hier nicht überflüssig, da wiederholt 'printf' vorkommt (C)?

... komplette Frage anzeigen

6 Antworten

Du musst sie immer schreiben, damit der Compiler weiß, wenn eine Anweisung zuende ist. Dies geschieht in C durch das Semikolon. Es gibt auch Sprachen wie Python, in denen als Trennzeichen ein Zeilenumbruch verwendet wird. Das Trennzeichen muss aber immer vorhanden sein, selbst wenn sich gleiche Befehle wiederholen.

Antwort bewerten Vielen Dank für Deine Bewertung

Also grundsätzlich benötigst du ein Semikolon nach einer Anweisung, ...

... aber es gibt in deinem Beispiel auch einige lustige Ausnahmen, die du dir aber AUSDRÜCKLICH nicht angewöhnen solltest!

Version 1: Komma statt Semikolon außer am Schluss ...

#include <stdio.h>

int main() {
printf("10 + 5 = %i\\\\n", 10 + 5),
printf("10 - 5 = %i\\\\n", 10 - 5);
}

Version 2: Ein binärer oder arithmetischer Operator wie +, - &, oder | ...

#include <stdio.h>

int main() {
printf("10 + 5 = %i\\\\n", 10 + 5) ^
  printf("10 - 5 = %i\\\\n", 10 - 5);
}

Version 3: Eine Schachtelung mit Null-hack ...

#include <stdio.h>

int main() {
printf("10 + 5 = %i\\\\n\\\\0%i", 10 + 5,
printf("10 - 5 = %i\\\\n", 10 - 5));
}

Version 4: Wie Version 1, aber mit Trigraphen ...

#include <stdio.h>

int main() {
printf("10 + 5 = %i\\\\n", 10 + 5) ??!
printf("10 - 5 = %i\\\\n", 10 - 5);
}

In der obigen Reihenfolge werden diese "Möglichkeiten" aber auch immer grauenvoller. Den ersten Komma-Trick verwendet man tatsächlich teilweise bei C++ Template Metaprogrammierung, aber das ist ein anderes paar Schuhe.

Die zweite Version ist eigentlich nur dann sinnvoll, falls du auch am Ergebnis der Operaion interessiert bist.

Und die dritte Variante ist einfach nur als gammeliger "Hack" zu bezeichnen, der eigentlich nur dazu dient zu zeigen, "dass es geht".

Die vierte Variante wird bei modernem C nicht mehr richtig funktionieren, da Trigraphen in sehr naher Zukunft aus dem Standard entfernt werden dürften (wie bereits bei C++ geschehen).

Ach so, und bei obigen Beispielen wirst du vermutlich einige Compilerwarnungen erhalten, die du bei diesen kurzen Snippets aber ignorieren kannst (was man sonst NIEMALS tun sollte).

Nochmal: Gewöhne dir bitte KEINE der obigen Tricks an! Das ist alles Murks und dient ausschließlich der Demonstration. Und Compiler-Warnungen IMMER beachten!

Es ist schön, dass du das jetzt gelesen hast, und du kannst es ja auch im Hinterkopf behalten, aber grundsätzlich solltest du einfach Semikola nutzen und das lernen, was in deinem Lehrbuch / Tutorial steht! :)

Naja, viel Spaß noch! :)

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von TeeTier
30.06.2017, 00:33

PS: Ich habe gerade noch die kurze Antwort von RakonDark gelesen und normalerweise sind solche ellenlangen Funktionsaufrufe natürlich sehr schlecht lesbar, aber String-Literale in C besitzen die Fähigkeit, ohne zusätzlichen Operator aneinander gehängt werden zu können, und deshalb kannst du aus ...

printf("10 + 5 = %i\n10 - 5 = %i\n", 10 + 5, 10 - 5);

... das hier machen:

printf(
"10 + 5 = %i\n"
"10 - 5 = %i\n",
10 + 5,
10 - 5
);

Das ist jetzt schon deutlich lesbarer, aber trotzdem nicht gerade elegant (aber effizient!) und wirkt evtl. verwirrend, da die Strings ohne irgendetwas dazwischen aneinander gepappt werden.

Fazit: Lange Funktionsschwänze vermeiden und lieber mehrere kurze Aufrufe hintereinander setzen; sofern es denn sinnvoll ist und nicht penibel auf perfekte Effizienz geachtet werden muss! :)

2
Kommentar von iwolmis
30.06.2017, 00:46

Sehr schöne Beispiele findet man in "Obfuscatet C and others Mysteries" von Don Liebes. Ich empfehle Euch es zu lesen :-)))

2

Möglich ist, was ich auch schon öfter gesehn hab, die einzelnen print Anweisung in eine zusammenzufassen und dann einfach Absätze nach jedem \\\\n zur Lesbarkeit macht. Da allerdings format specifier im Text sind ist das hier eher schlechter Stil, da unlesbar.
So eine Trennung kenn ich eher bei Java, also sollte der Code bleiben, wie er ist ;)

Antwort bewerten Vielen Dank für Deine Bewertung

Sehr schöne Beispiele findet man in "Obfuscatet C and others Mysteries" von Don Liebes. Ich empfehle Euch es zu lesen :-)))

Hier zwei JPG's

Antwort bewerten Vielen Dank für Deine Bewertung

Vielleicht ist es auch irgendwie ohne möglich. Aber ich rate dir egal was du schreibst das so zu machen wie in deiner frage. Jede Funktion bzw alles was du schreibst sauber getrennnt.

Sagen wir später willst du was hinzufügen, und schreibst was zwischen die zeilen (nichtsahnend) und plötzlich geht nix mehr, und du darfst auf fehlersuche gehen!

Antwort bewerten Vielen Dank für Deine Bewertung

klar kannst du das in einen printf zusammenfassen , sieht dann halt total unübersichtlich aus .


Antwort bewerten Vielen Dank für Deine Bewertung

Was möchtest Du wissen?