Laden...

Wann muss ich genau einen Anweisungsblock anwenden?

Erstellt von nytrec vor 6 Jahren Letzter Beitrag vor 6 Jahren 2.087 Views
N
nytrec Themenstarter:in
37 Beiträge seit 2017
vor 6 Jahren
Wann muss ich genau einen Anweisungsblock anwenden?

Hallo Leute. 🙂

Ich habe hier im Forum gelesen, dass das anwenden von einem Anweisungblock, eine Sache des Stils ist. Doch beim programmieren scheint es bei einigen Sachen nicht so zu sein.

Wenn ich zum Beispiel eine for-Schleife ohne Anweisungsblock schreibe:


for (int i = 1; i <= 5; i++)
Console.Write("Geben Sie die {0}. Zahl ein: ", i);

Wird in der Console 5 mal hintereinander der Text *Geben Sie die die X Zahl ein: ausgeführt. Gibt man das ganze mit einem Anweisungsblock ein, wird das ganze wie gewollt 1mal in einer Schleife ausgeführt.

Auch in diesem Code wird ein Anweisungsblock für eine break Anweisung verlangt:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp20
{
    class Program
    {
        static void Main(string[] args)
        {
            int eingabe, schleife = 0;
            while (schleife <= 1)
            {
                Console.WriteLine("Was möchten Sie tun?");
                Console.WriteLine();
                Console.WriteLine("Rechnen");
                Console.WriteLine("Programm beenden!");
                Console.WriteLine();

                eingabe = Convert.ToInt32(Console.ReadLine());
                if (eingabe == 1)
                {
                    Console.WriteLine("Dann rechnen Sie 10 + 5"); break;
                }
                else if (eingabe == 2)
                {
                    Console.WriteLine("Programm wird beendet!"); break;
                }
                else
                {
                    Console.WriteLine("Sie müsseen sich für 1 oder 2 entscheiden!");
                    Console.WriteLine();
                    continue;
                }
                
            }
            schleife++;
            
        }
    }
}

Ich verstehe nicht genau, warum man das jetzt einsetzen muss. In meinen Studienheften wird das gar nicht erklärt oder ich habe da was übersehen. Könnt ihr mir das ausführlich erklären? ?(

N
nytrec Themenstarter:in
37 Beiträge seit 2017
vor 6 Jahren

Die zweite Schleife ist eine While-Schleife. Die Geschichte mit der for-Schleife bezog sich auf den ersten Code. Und das mit der Break ist doch nicht dein ernst?^^

16.807 Beiträge seit 2008
vor 6 Jahren

Statt meinen Beitrag zu editieren hab ich ihn gelöscht. Herrlich...

Ich hab tatsächlich Dein break nicht gesehen.
Vermutlich hat meine Auge es - wie es sich gehört - in Zeile für sich erwartet.

So ganz versteh ich ehrlich gesagt Deine Frage nicht.

Dein break in der While-Schleife führt dazu, dass die Schleife und damit das Programm beendet wird.
Kann das sein, dass Du eigentlich ein continue statt einem break willst?

Dein for-Beispiel läuft 5 mal durch, da

for (int i = 1; i <= 5; i++)
Console.Write("Geben Sie die {0}. Zahl ein: ", i);

das selbe wie

for (int i = 1; i <= 5; i++)
{
  Console.Write("Geben Sie die {0}. Zahl ein: ", i);
}

ist aber nicht das selbe wie


for (int i = 1; i <= 5; i++)
{
  Console.Write("Geben Sie die {0}. Zahl ein: ", i);
  break;
}
  

Der for-Schleifen-Fall hat irgendwie nichts mit dem while-Fall am Hut.

N
nytrec Themenstarter:in
37 Beiträge seit 2017
vor 6 Jahren

Vielen Dank erstmal, dass du dir Mühe machst, mir zu antworten. 👍

Also, meine Frage war allgemein: Wann muss ich genau einen Anweisungsblock anwenden?

Für die For-Schleife ist es zum Beispiel notwendig einen Anweisungsblock anzuwenden, damit er die Schleife durchlaufen kann. Der 2te Code hatte nichts mit dem ersten zu tun. Meine Frage zielte darauf ab, warum ich einen Anweisungsblock anwenden muss, damit ich einen Break anwenden kann.

😁

3.170 Beiträge seit 2006
vor 6 Jahren

Hallo,

stell die Frage besser andersrum: Wann braucht man keinen Anweisungsblock?
Du brauchst ihn nämlich immer, ausser der Block besteht nur aus einer einzigen Anweisung.
Nur in diesem Spezialfall kann man sich den Anweisungsblock mit den geschweiften Klammern sparen.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

16.807 Beiträge seit 2008
vor 6 Jahren

Empfehlenswert ist immer Anweisungen in einen Block zu packen, das fördert die Lesbarkeit.
Es gibt ganz wenig Fälle, in denen ich Anweisungen ohne Block in Projekten dulde; dazu gehört eigentlich nur das Abfangen von null-parametern in Methoden.
In meinen Augen wäre es (für alle Sprachen) auch besser gewesen, die Klammern als Pflicht zu nutzen.

public void Methode(string parameter)
{
   if (parameter == null) throw new ArgumentNullException(nameof(parameter));

   // code...
}

Innerhalb von Code ist es sehr zu empfehlen,immer Blöcke zu verwenden. Immer.
Auch die Microsoft Guidelines empfehlen das ausdrücklich.

Ein Muss sind Blöcke nur, wenn mehr als eine Anweisung ausgeführt werden soll.

N
nytrec Themenstarter:in
37 Beiträge seit 2017
vor 6 Jahren

Ihr seid Crazy, Jungs! Vielen Dank! Bei mehreren Anweisungen muss man also nen Block anwenden. 😁 👍

Darf ich euch noch eine Frage stellen? Es geht nochmals um diesen Code hier:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp20
{
    class Program
    {
        static void Main(string[] args)
        {
            int eingabe, schleife = 0;
            while (schleife <= 1)
            {
                Console.WriteLine("Was möchten Sie tun?");
                Console.WriteLine();
                Console.WriteLine("Rechnen");
                Console.WriteLine("Programm beenden!");
                Console.WriteLine();

                eingabe = Convert.ToInt32(Console.ReadLine());
                if (eingabe == 1)
                {
                    Console.WriteLine("Dann rechnen Sie 10 + 5"); break;
                }
                else if (eingabe == 2)
                {
                    Console.WriteLine("Programm wird beendet!"); break;
                }
                else
                {
                    Console.WriteLine("Sie müsseen sich für 1 oder 2 entscheiden!");
                    Console.WriteLine();
                    continue;
                }

            }
            schleife++;

        }
    }
}


Wenn ich die Anweisung schleife++ unterhalb der else Anweisung einfüge (unter dem Schweif), beschwert sich der Compiler mit der Message: Unerreichbarer Code wurde entdeckt.

Bei vielen Übungsaufgaben, die ich bereits gemacht habe, war es so, dass sich die Anweisung noch innerhalb der Schleife befand.
Also:


else
                {
                    Console.WriteLine("Sie müsseen sich für 1 oder 2 entscheiden!");
                    Console.WriteLine();
                    continue;
                }
                schleife++

Warum muss ich nun die Anweisung außerhalb der Schleife anwenden? 🙂

16.807 Beiträge seit 2008
vor 6 Jahren

Das ist Logik, Du musst nur Deinen Code anschauen und selbst verstehen, was Du da machst.

Du hast drei Möglichkeiten wie Dein Code verläuft:

  1. eingabe == 1
  2. eingabe == 2
  3. alles andere

Bei allen drei Möglichkeiten hast Du entweder ein break oder ein continue, sodass Du zum while-Kopf hoch springst.
Der Code drunter kann also nie erreicht werden.

N
nytrec Themenstarter:in
37 Beiträge seit 2017
vor 6 Jahren

Jopp, verstanden. Thx 🙂 👍