AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

switch, break, case c++

Ein Thema von EWeiss · begonnen am 27. Aug 2017 · letzter Beitrag vom 28. Aug 2017
Antwort Antwort
Glados
(Gast)

n/a Beiträge
 
#1

AW: switch, break, case c++

  Alt 27. Aug 2017, 10:25
http://en.cppreference.com/w/cpp/language/switch

Das break muss über die letzte schließende Klammer, nicht darunter.
Das wurde aber auch schon erwähnt.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: switch, break, case c++

  Alt 27. Aug 2017, 10:32
http://en.cppreference.com/w/cpp/language/switch

Das break muss über die letzte schließende Klammer, nicht darunter.
Das wurde aber auch schon erwähnt.
Sorry dann sage das MS denn in deren Beispiel ist es nicht So.
Und das wurde auch schon erwähnt.
Siehe case a eines der letzten Beispiele.

Code:
   case 'a' :
         { 
         // Declaration of szChEntered OK. Local scope.
         char szChEntered[] = "Character entered was: ";
         cout << szChEntered << "a\n";
         } 
         break;
Ich kann dir auch Zig Links nennen wo es jedes mal unterschiedlich ist.
Dann müsste nach deiner Annahme das Beispiel in der MSDN falsch sein.

Zitat:
Ich stelle mit { und } immer als Ersatz für begin und end vor.
Habe ich auch bin davon aber sehr schnell von abgekommen weil es anscheinend keine vom Compiler vorgeschriebene Definition für Case Anweisungen gibt
mal abgesehen davon das Klammern geschlossen werden müssen.
Nun wer definiert nun was richtig und was falsch ist.

MSDN, diverse C++ Tutorials die Wiki oder was auch immer.

Zitat:
Fälle wo man das break absichtlich weglässt um den Code des nächsten case-Zweiges ebenfalls auszuführen
Das ist korrekt


gruss

Geändert von EWeiss (27. Aug 2017 um 10:44 Uhr)
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#3

AW: switch, break, case c++

  Alt 27. Aug 2017, 10:52
Code:
   case 'a' :
       { 
       // Declaration of szChEntered OK. Local scope.
       char szChEntered[] = "Character entered was: ";


       cout << szChEntered << "a\n";
       } 
       break;
 
   case 'b' :
       // Value of szChEntered undefined.
       cout << szChEntered << "b\n";
       break;
 
   default:
       // Value of szChEntered undefined.
       cout << szChEntered << "neither a nor b\n";
       break;
   }
"einmal klammer nach Case einmal keine..
welcher sinn steckt dahinter."...


=> Der Sinn von Klammern ist also, das es innerhalb derer möglich ist, neue lokal gültige Variablen zu definieren
=> wenn keine Variablen definiert werden, braucht es beim "Case" oder "Default" keine geschweiften Klammern
=> das "Break" ist kein "End" im Sinne einer schließenden Klammer... man kann auch mehrere Breaks innerhalb eines "Case" oder "Default" verwenden
-> beim "Break" vor oder nach der letzten schließenden geschweiften Klammer gibt es nur einen Unterschied. Hält man per Debugger da an, sind innerhalb der Klammern die lokalen Variablen noch gültig und prüfbar, nach der schließenden Klammer sind die davor innerhalb der Klammern angelegten Variablen ungültig und nicht mehr zugreifbar...
- dem "switch" ist die Position eines beliebigen "breaks" innerhalb der "switch"-Klammern egal, das "break" ist nix weiter wie ein "goto EndOfSwitch;"


Die Syntax ist durchaus eindeutig...
- im "case" MUSS man bei Verwendung von lokalen Variablen Klammern verwenden
- für den "switch" ist die Position der "breaks" völlig egal... das erste was zur Ausführung kommt macht ein "GotoEndOfSwich" (ohne "break" geht es also auch, denn so schreibt man in "C" das was man in Delphi mit Komma getrennen Werten macht:
Code:
switch(x)
{
  case 0:
       x=-1;
       break;

  case 1:
  case 2:
  case 3:
       y=x*3;
       break;

  case 4:
  case 5:
  case 6:
       y=x*5;
       break;

  default:
       y=-1;
       break;
}

Geändert von mensch72 (27. Aug 2017 um 11:01 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#4

AW: switch, break, case c++

  Alt 27. Aug 2017, 10:58
Das ist eine gute Erklärung bin jetzt schon mal etwas weiter. Danke!

Zitat:
- dem "switch" ist die Position eines beliebigen "breaks" innerhalb der "switch"-Klammern egal, das "break" ist nix weiter wie ein "goto EndOfSwitch;"
Was ich hier aber festgestellt habe..
Das beim Debuggen wenn ich den Breakpoint auf break setze (FullScreen) er innerhalb des Switch auf das nächste break springt.
Ist das korrekt?

Denn das widerspräche ja deiner Aussage.
Durch den break sollte ich doch eigentlich aus der Winproc rausspringen ohne Rückgabe von DefWindowProc.

gruss

Geändert von EWeiss (27. Aug 2017 um 11:03 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#5

AW: switch, break, case c++

  Alt 27. Aug 2017, 11:01
Zitat:
=> scheinbar ist nichts falsch.
Du hast aber meinen Einwand bzw.. die Beschwerde eines anderen gelesen ?

Zitat:
Also your SWITCH CASE looks very strange to me because of the extra braces.
Ich möchte nicht gerne als ein Dummerschen hingestellt werden nur weil ich angeblich(<>) ein Break falsch setze.
Deshalb ja der Thread hier!

Also wäre auch das korrekt. ?

Code:
        case ID_FULLSCREEN:
             gP.bFullScreen = !gP.bFullScreen;
             SetForegroundWindow(hWnd);
             if (gP.bFullScreen)
             { // << hier Klammer weil eine globale Variable definiert wird in dem Fall RECT
                 RECT rect;
                 rect.right = GetSystemMetrics(SM_CXSCREEN);
                 rect.bottom = GetSystemMetrics(SM_CYSCREEN);
                 SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
                 AdjustWindowRect(&rect, WS_POPUP, FALSE);
                 MoveWindow(hWnd, 0, 0, rect.right, rect.bottom, FALSE);
             }
             else
             { // << das selbe hier
                 RECT rect;
                 rect.right = dpi(XMIN_SIZE);
                 rect.bottom = dpi(YMIN_SIZE);
                 rect.left = (GetSystemMetrics(SM_CXSCREEN) - rect.right) / 2;
                 rect.top = (GetSystemMetrics(SM_CYSCREEN) - rect.bottom) / 2;
                 SetWindowLongPtr(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE);
                 AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
                 MoveWindow(hWnd, rect.left, rect.top, dpi(XMIN_SIZE), dpi(YMIN_SIZE), FALSE);
             }
         break;
oder?
Code:
        case ID_FULLSCREEN:
        {
            RECT rect;
            gP.bFullScreen = !gP.bFullScreen;
            SetForegroundWindow(hWnd);
            if (gP.bFullScreen)
            {
                rect.right = GetSystemMetrics(SM_CXSCREEN);
                rect.bottom = GetSystemMetrics(SM_CYSCREEN);
                SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
                AdjustWindowRect(&rect, WS_POPUP, FALSE);
                MoveWindow(hWnd, 0, 0, rect.right, rect.bottom, FALSE);
            }
            else
            {
                rect.right = dpi(XMIN_SIZE);
                rect.bottom = dpi(YMIN_SIZE);
                rect.left = (GetSystemMetrics(SM_CXSCREEN) - rect.right) / 2;
                rect.top = (GetSystemMetrics(SM_CYSCREEN) - rect.bottom) / 2;
                SetWindowLongPtr(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE);
                AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
                MoveWindow(hWnd, rect.left, rect.top, dpi(XMIN_SIZE), dpi(YMIN_SIZE), FALSE);
            }
        }
        break;
gruss

Geändert von EWeiss (27. Aug 2017 um 11:16 Uhr)
  Mit Zitat antworten Zitat
mensch72

Registriert seit: 6. Feb 2008
838 Beiträge
 
#6

AW: switch, break, case c++

  Alt 27. Aug 2017, 11:12
Ein Grundsatzhinweis bezgl. der Frage was stimmt beim break vom FullScreen nicht...

- bitte rücke IMMER nach der öffnenden Klammer hinter dem "switch" alle "case" und das "default" um eine Standardbreite ein!
- so wie aktuell geschrieben zerstörst du deine sonst ja sehr einheitliche optische Struktur, so dass es mir gerade "optisch" ohne Editor nicht möglich ist, "einfach" den Punkt zu finden, wo du dich in der Klammerebene vertan hat, dass es dann (wohl etwas später) zum Problem bei "break vom FullScreen" kommt
- das ist nur ein netter Hinweis der dir und anderen die Arbeit beim lesen deines Source wesentlich erleichtert(du bist deshalb kein Dummerchen)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#7

AW: switch, break, case c++

  Alt 27. Aug 2017, 11:19
Zitat:
Ein Grundsatzhinweis bezgl. der Frage was stimmt beim break vom FullScreen nicht...
Sollte das nicht der Formatierer tun?

Manchmal rückt er das break ein aber manchmal auch nicht.
Hier würde er ihn einrücken.
Code:
   case 'b' :
        // Value of szChEntered undefined.
        cout << szChEntered << "b\n";
        break;
hier aber nicht.
Code:
   case 'b' :
   { 
        // Value of szChEntered undefined.
        cout << szChEntered << "b\n"
   } 
   break;
EDIT:
Habe es mal getestet..
Zitat:
=> Der Sinn von Klammern ist also, das es innerhalb derer möglich ist, neue lokal gültige Variablen zu definieren
=> wenn keine Variablen definiert werden, braucht es beim "Case" oder "Default" keine geschweiften Klammern
In beiden fällen kompiliert es Fehler frei.
Code:
        case ID_FULLSCREEN:
       // {
            RECT rect;
            gP.bFullScreen = !gP.bFullScreen;
            SetForegroundWindow(hWnd);
            if (gP.bFullScreen)
            {
                rect.right = GetSystemMetrics(SM_CXSCREEN);
                rect.bottom = GetSystemMetrics(SM_CYSCREEN);
                SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
                AdjustWindowRect(&rect, WS_POPUP, FALSE);
                MoveWindow(hWnd, 0, 0, rect.right, rect.bottom, FALSE);
            }
            else
            {
                rect.right = dpi(XMIN_SIZE);
                rect.bottom = dpi(YMIN_SIZE);
                rect.left = (GetSystemMetrics(SM_CXSCREEN) - rect.right) / 2;
                rect.top = (GetSystemMetrics(SM_CYSCREEN) - rect.bottom) / 2;
                SetWindowLongPtr(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE);
                AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
                MoveWindow(hWnd, rect.left, rect.top, dpi(XMIN_SIZE), dpi(YMIN_SIZE), FALSE);
            }
            break;
       // }
Code:
        case ID_FULLSCREEN:
        {
            RECT rect;
            gP.bFullScreen = !gP.bFullScreen;
            SetForegroundWindow(hWnd);
            if (gP.bFullScreen)
            {
                rect.right = GetSystemMetrics(SM_CXSCREEN);
                rect.bottom = GetSystemMetrics(SM_CYSCREEN);
                SetWindowLongPtr(hWnd, GWL_STYLE, WS_POPUP | WS_VISIBLE);
                AdjustWindowRect(&rect, WS_POPUP, FALSE);
                MoveWindow(hWnd, 0, 0, rect.right, rect.bottom, FALSE);
            }
            else
            {
                rect.right = dpi(XMIN_SIZE);
                rect.bottom = dpi(YMIN_SIZE);
                rect.left = (GetSystemMetrics(SM_CXSCREEN) - rect.right) / 2;
                rect.top = (GetSystemMetrics(SM_CYSCREEN) - rect.bottom) / 2;
                SetWindowLongPtr(hWnd, GWL_STYLE, WS_OVERLAPPEDWINDOW | WS_VISIBLE);
                AdjustWindowRect(&rect, WS_OVERLAPPEDWINDOW, FALSE);
                MoveWindow(hWnd, rect.left, rect.top, dpi(XMIN_SIZE), dpi(YMIN_SIZE), FALSE);
            }
        }
        break;
Seltsam.. Es scheint wohl keine Richtlinien zu geben.

gruss

Geändert von EWeiss (27. Aug 2017 um 11:34 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz