BSDForen.de  

Zurück   BSDForen.de > Geekstuff > Programmieren

Antwort
 
Themen-Optionen Thema bewerten Ansicht
Alt 25.07.2012, 10:19   #1
Herakles
Profifragensteller
 
Benutzerbild von Herakles
 
Registrierungsdatum: Jun 2003
Ort: Emsdetten
Beiträge: 983
Herakles eine Nachricht über ICQ schicken
Question [C]"default" bei "switch/case" immer notwendig?

Moin!

Hat ein

Code:
default: (...) break;
irgendeinen Sinn, wenn dieser Codeteil nie erreicht werden kann?

Nehmen wir sowas an:

Code:
if( (p!=1) && (p!=2) ) return -1; switch(p) { case 1: printf("toll\n"); break; case 2: printf("hurra\n"); break; default: break; }
Der default-Teil wird nie erreicht. Sollte er dennoch im Code zu finden sein?

Viele Grüße
Herakles, der Profi-Frager
Herakles ist offline   Mit Zitat antworten
Alt 25.07.2012, 10:21   #2
-Nuke-
Registered User
 
Benutzerbild von -Nuke-
 
Registrierungsdatum: Jul 2004
Beiträge: 338
-Nuke- eine Nachricht über AIM schicken
Nö. Es ist bei dem Code egal ob default jetzt so da steht oder nicht. Maximal eine Verständlichkeit, aka:

default da: Man erwartet andere Werte, tut dann aber nichts

default nicht da: Man erwartet keine anderen Werte
__________________
Ich glaube das hier ist 'ne Signatur...

MfG
-Nuke-
-Nuke- ist offline   Mit Zitat antworten
Alt 25.07.2012, 12:14   #3
dettus
Bicycle User
 
Benutzerbild von dettus
 
Registrierungsdatum: Aug 2004
Ort: nuernberg
Beiträge: 2.532
das default geht in die richtung von
Code:
for (;;) {} // loop forever printf("yay! forever came!!\n");
aber spass beiseite: es ist guter programmierstil den mit einzubauen, vielleicht aendert sich ja im laufe der zeit etwas.
gute compiler optimieren den weg. im schlimmsten fall wird dein programm ein paar bytes groesser und ein paar takte langsamer.
__________________
Computer science is not about using a computer. It is about unleashing its powers.
dettus ist offline   Mit Zitat antworten
Alt 25.07.2012, 12:39   #4
h^2
Moderators
 
Registrierungsdatum: Sep 2009
Beiträge: 869
Langsamer sollte das Programm dadurch auf keinen Fall werden. Wenn in jedem Fall ein break vor dem default aufgerufen wird, ist wird das was danach kommt egal, da können auch noch beliebige andere Bdingungen auftauchen. Bei einem
if (( a==b) || (c==d))
wird (c==d) auch nie geprüft, wenn (a==b) immer stimmt.
__________________
Wir kommen aus /dev/null und wir gehen nach /dev/null, alles dazwischen ist ziemlich /dev/random.

Mein Blog zu BSD und Freier Software: https://blogs.fsfe.org/h2
h^2 ist offline   Mit Zitat antworten
Alt 25.07.2012, 13:09   #5
Rakor
Moderators
 
Registrierungsdatum: Sep 2009
Beiträge: 697
Sollte das nicht eh vom Compiler wegoptimiert werden?
__________________
Meine Installationsmitschrift
Rakor ist offline   Mit Zitat antworten
Alt 25.07.2012, 13:42   #6
döna
Registered User
 
Registrierungsdatum: Dec 2006
Ort: Fürth
Beiträge: 100
Es ist halt mehr so ne Maintainance-Sache.
Normalerweise steht nach dem Default sowas wie assert(0);
in der Release-Version wird dieses dann vom Compiler wegoptimiert
und wenn du mal was erweiterst, siehst du, ob und wo du den Case
vergessen hast.
__________________
"Any problem in computer science can be solved with another layer of indirection.
But that usually will create another problem."
(David Wheeler)
döna ist offline   Mit Zitat antworten
Alt 25.07.2012, 14:04   #7
dettus
Bicycle User
 
Benutzerbild von dettus
 
Registrierungsdatum: Aug 2004
Ort: nuernberg
Beiträge: 2.532
NOOBS

mehr oder weniger code hat durchaus auswirkungen auf die ausfuehrungszeit
weil der dann u.u. den instruction-cache anders beeinflusst.

das wird aber erst dann interessant wenn ihr an embedded systemen rumschraubt die echtzeitfaehig sein muessen. von daher: macht euch keine sorgen.
und das a==b||c==d wird auch nur dann nicht ausgewertet wenn das ausfuehrende system eine lazy evaluation kann.
"system" schliesst hierbei den compiler mit ein.

ich habs mal eben probiert, gcc 4.1.2 auf einem amd64 linux kanns zum beispiel.
__________________
Computer science is not about using a computer. It is about unleashing its powers.
dettus ist offline   Mit Zitat antworten
Alt 25.07.2012, 19:26   #8
Tron
Registered User
 
Registrierungsdatum: Apr 2004
Beiträge: 267
Zitat:
Zitat von dettus Beitrag anzeigen
und das a==b||c==d wird auch nur dann nicht ausgewertet wenn das ausfuehrende system eine lazy evaluation kann.
"system" schliesst hierbei den compiler mit ein.

ich habs mal eben probiert, gcc 4.1.2 auf einem amd64 linux kanns zum beispiel.
Das Verhalten ist keine Lust-und-Laune-Sache, die C-Norm schreibt dies vor:
Zitat:
Zitat von ISO/IEC 9899:1999 (E) §6.5.14:4
[...] If the first operand compares unequal to 0, the second operand is not evaluated.
Im Allgemeinen ist es unentscheidbar, ob ein bestimmter Punkt in einem Programm erreichbar ist oder nicht. Es bedarf schon einiger Analyse, um auch nur das Eingangsbeispiel zu bewältigen.
Es gibt aber einen Grund, default bewusst wegzulassen: Aufzählungen.
Code:
enum E { A, B, C } x; ... switch (x) { case A: ... return; case B: ... return; } abort();
Lässt man default weg und fügt einen weiteren Eintrag in die Aufzählung ein (im Beispiel das C), dann wird ein heutiger Übersetzer eine Warnung ausgeben, dass man den Fall C nicht in dem switch behandelt.
Tron ist offline   Mit Zitat antworten
Alt 26.07.2012, 07:54   #9
oenone
Programmierer
 
Benutzerbild von oenone
 
Registrierungsdatum: Nov 2002
Ort: Bremen
Beiträge: 2.551
Manchmal gibt es auch Code-Richtlinien von der Firma, für die man arbeitet. Da kann es festgeschrieben sein, dass es auf jeden Fall ein "default" geben muss.
__________________
if you don't remember something, it never happened.
if you aren't remembered, you never existed.
oenone ist offline   Mit Zitat antworten
Alt 26.07.2012, 08:12   #10
dettus
Bicycle User
 
Benutzerbild von dettus
 
Registrierungsdatum: Aug 2004
Ort: nuernberg
Beiträge: 2.532
Zitat:
Zitat von Tron Beitrag anzeigen
Das Verhalten ist keine Lust-und-Laune-Sache, die C-Norm schreibt dies vor:
ah! man lernt halt nie aus.
cool! dann werde ich das demnaechste oefter verwenden!!! danke!!!!!!!!!!!

aber abgesehen davon war meine aussage jetzt auch nicht c-spezifisch gemeint. lassen wir das, ist ja doch ein [c] topic.
__________________
Computer science is not about using a computer. It is about unleashing its powers.
dettus ist offline   Mit Zitat antworten
Antwort


Dieses Thema betrachten zurzeit 1 Personen. (0 registrierte Benutzer und 1 Gäste)
 
Themen-Optionen
Ansicht Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist An.
Smileys sind An
[IMG] Code ist An
HTML-Code ist Aus
Gehe zu

Ähnliche Themen
Thema Erstellt von Forum Antworten Letzter Beitrag
ports updaten & feststellen wann ein update notwendig ist casualx OpenBSD - Pakete und Anwendungen 17 13.02.2012 12:01
TLS-Zertifikat von CAcert.org: Account bei CAcert notwendig? testit FreeBSD - Allgemein 4 14.11.2011 20:42
Neustart nach freebsd-update notwendig? worel FreeBSD - Allgemein 7 19.02.2008 09:08
Perl 5.8.x notwendig?! miguel FreeBSD - Anwendungen und Ports 4 27.07.2004 23:32
Netzwerkinstallation zwingend notwendig ?? krillehb FreeBSD - Installation 7 21.04.2004 20:34


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 Uhr.


Powered by vBulletin (Deutsch)
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.