2016-03-19 10 views
-6

Ich hätte gerne die else Anweisung für die erste if. Etwas wie folgt aus:Ist dies die eleganteste/sicherste/empfohlene Lösung für diese Situation?

if (vowels_counter >= consonants_counter) 
    for (i = 0; ntca[i]; i++) 
     for (j = 0; vowels[j]; j++) 
      if (ntca[i] == vowels[j]) 
      { ntca[i] += 1; 
       break; 
      } 
else 
    for (i = 0; ntca[i]; i++)... 

Aber Sie sehen, wie die else mit dem zweiten if verbunden ist:

if (vowels_counter >= consonants_counter) 
     for (i = 0; ntca[i]; i++) 
      for (j = 0; vowels[j]; j++) 
       if (ntca[i] == vowels[j]) 
       { ntca[i] += 1; 
        break; 
       } 

       else 
        for (i = 0; ntca[i]; i++)... 

Ich löste diese Situation durch die verschachtelte if setzen und die for in Klammern wie folgt aus:

if (vowels_counter >= consonants_counter) 
     for (i = 0; ntca[i]; i++) 
      {for (j = 0; vowels[j]; j++) 
       {if (ntca[i] == vowels[j]) 
        {ntca[i] += 1; 
        break; 
        } 
       } 
      } 

    else 
     for (i = 0; ntca[i]; i++)... 

Ist dies die eleganteste/sicherste/empfohlene Lösung? Vielen Dank!

+0

Es klingt wie Sie sagen, dass Sie die Einrückung beeinflussen möchten, wie das Programm interpretiert wird, ist das wahr? –

+4

Es gibt eine andere Lösung: ** immer ** Klammern mit 'if',' else', 'for',' do', 'while' verwenden. Auf diese Weise wird die Absicht klarer und neben anderen Vorteilen tritt das Problem, das Sie jetzt haben, nicht auf. Je. – axiac

+0

so etwas, wenn es möglich wäre, Vaughn Cato – Skyp89

Antwort

6

Gibt es eine andere Lösung für diese Situation ohne Klammern zu verwenden?

Das ist die falsche Frage. Die eigentliche Frage ist: Gibt es jemals einen Grund, KEINE Klammern zu benutzen? NEIN. Verwenden Sie einfach Klammern. Ihre Kollegen und Ihre Zukunft werden Ihnen später danken.

+0

" das ist die falsche Frage "- es sei denn, Sie betreten einen verschleierten c-Wettbewerb: http://www.ioccc.org/ –

-4

Eine Lösung besteht darin, den Zustand des inneren if zu negieren und den Prozess auf zu setzen.

if (vowels_counter >= consonants_counter) 
    for (i = 0; ntca[i]; i++) 
     for (j = 0; vowels[j]; j++) 
      if (!(ntca[i] == vowels[j])); else 
      { ntca[i] += 1; 
       break; 
      } 
else 
    for (i = 0; ntca[i]; i++)... 
+1

Es funktioniert, aber es ist nicht genau das, was man elegant oder lesbar/wartbar nennen würde. –

+0

bessere Lösung, @ Joachim Pileborg? – Skyp89

+0

Ich kann mir eine ähnliche vorstellen mit 'else; else' – chqrlie

4

Was Sie versuchen, ist nicht so einfach: die else bindet an die nächste ausstehende if Anweisung. Sie müssen mindestens Klammern um den Körper einer der for Aussagen legen, oder schlimmer noch, fügen Sie eine leere else; Klausel zu verschachtelten if.

Aber das ist NICHT was Sie tun sollten!

Beachten Sie, dass es schlechter Stil nicht Klammern von if, for, while kommandierte für Anweisungen verwenden do usw., die auf einer einzigen Zeile nicht beschränkt sind. Es ist fehleranfällig und nicht sehr lesbar. Verwenden Sie großzügig Klammern und halten Sie Ihren Code vor späteren Änderungen durch weniger versierte (oder weniger nüchterne) Programmierer, die es zu leicht brechen würden.

Klassische Kernighan und Ritchie Stil sieht wie folgt aus:

if (vowels_counter >= consonants_counter) { 
     for (i = 0; ntca[i]; i++) { 
      for (j = 0; vowels[j]; j++) { 
       if (ntca[i] == vowels[j]) { 
        ntca[i] += 1; 
        break; 
       } 
      } 
     } 
    } else { 
     for (i = 0; ntca[i]; i++) { 
      ... 
     } 
    } 
1

I Klammern um den Körper der if Anweisung verwenden würde, dann ist es die einfachste und lesbar Option:

if (vowels_counter >= consonants_counter) 
{ 
    for (... 
} 
else 
{ 
    for (... 
} 

aber nur zum Spaß:

if (vowels_counter >= consonants_counter) 
    for (i = 0; ntca[i]; i++) 
    { 
    for (j = 0; vowels[j] && ntca[i] != vowels[j]; j++) 
     ; 

    ntca[i] += (vowels[j] && ntca[i] == vowels[j]); 
    } 
else 
    for (i = 0; ntca[i]; i++) // ... 
-2

Der naheliegende Weg ist, ein weitereshinzuzufügen, gefolgt von einer leeren Anweisung (d. H. sofort von einer ;)

if (vowels_counter >= consonants_counter) 
    for (i = 0; ntca[i]; i++) 
     for (j = 0; vowels[j]; j++) 
      if (ntca[i] == vowels[j]) 
      { ntca[i] += 1; 
       break; 
      } 
      else ;  // note presence of ; here 
else 
    for (i = 0; ntca[i]; i++) 

Doch obwohl es um die Frage, wie gefragt antwortet, dann ist dies eine Technik, nicht das ich je empfehlen würde.Es gibt so viele Möglichkeiten, dass solche Hacker Programmierer - einschließlich sich selbst in Zukunft - verwirren könnten, dass es sich einfach nicht lohnt. Code, der leicht zu missverstehen ist, ist leicht falsch zu verstehen.

in die Gewohnheit, die Leichen von if des Vergeben, for, else, etc in geschweiften Klammern, wenn Sie eine sehr spezifische und überzeugend haben (an jemanden andere) Rechtfertigung nicht. Solche Dinge werden in den meisten Styleguides aus gutem Grund dringend empfohlen. Und denken Sie daran, dass die Einrückung die Bedeutung von Code in keiner Weise ändert.

+4

Entschuldigung, ich muss runter gehen diese Empfehlung. Es macht es jetzt umso schlimmer, dass diesem Benutzer jetzt ein Trick gezeigt wurde, mit noch weniger Klammern fortzukommen. Ja, Sie erklären, warum Sie dies tun sollten ... aber die Erklärung, warum nicht, ist unter dem Code begraben, den der Benutzer nicht darüber hinaus betrachten wird, da diese Antwort das Häkchen erhält, während andere Antworten die gleichen Vorsichtsmaßnahmen bieten bekomme das Häkchen nicht. – nhgrif

+0

Diese Lösung verschärft das Problem, vor dem uns Zahnspangen schützen. Dieser Code wird schnell unlesbar (wenn es nicht bereits ist), sobald der Einzug gebrochen ist, aber schlimmer, wenn diese "else;" - Zeile entweder versehentlich oder absichtlich entfernt wird (weil sie seltsam oder zufällig aussieht), ist der Code jetzt gebrochen. Zahnspangen stehen für die Identifikation von * Absicht *, die von entscheidender Bedeutung ist, und diese Antwort bietet dem Fragesteller ein verlängertes Leben, um sich an schrecklichen Praktiken vorbeizuschleichen. – nhgrif

+0

@ Skyp89: Die Annahme dieser Antwort ermutigt andere Programmierer, schmutzige Tricks zu verwenden. Was ist los mit ein paar extra Klammern, die Ihren Code viel stabiler machen, immun gegen dumme Nebenwirkungen von späteren Änderungen durch nicht so schlaue Programmierer. – chqrlie

Verwandte Themen