Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. The Lounge
  3. for those of you purists that don't like break, continue and goto

for those of you purists that don't like break, continue and goto

Scheduled Pinned Locked Moved The Lounge
question
65 Posts 21 Posters 1 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • N Nand32

    At times, the purpose of the search might be just to find the index of the valueToFind. Break keeps the index safe?

    (JS)
    var arr =[0,1,2,3,4,5];
    var valueToFind = 3;

    for(i=0;i

    H Offline
    H Offline
    honey the codewitch
    wrote on last edited by
    #28

    right, but in the OP i limited i to the loop scope, but yeah.

    When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

    1 Reply Last reply
    0
    • H honey the codewitch

      why do this?

      for(int i = 0;i
      instead of

      for(int i = 0;i

      hengh?? why you still use break?

      :laugh:

      When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

      N Offline
      N Offline
      Night Fox Localhost
      wrote on last edited by
      #29

      I prefer break statements. It is not suitable for big projects it might be confusing. I try my level best to write clean code!

      1 Reply Last reply
      0
      • H honey the codewitch

        why do this?

        for(int i = 0;i
        instead of

        for(int i = 0;i

        hengh?? why you still use break?

        :laugh:

        When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

        G Offline
        G Offline
        Gary R Wheeler
        wrote on last edited by
        #30

        Because the second fragment duplicates knowledge of the loop's termination condition. You have to remember to adjust it in two places. The first fragment is therefore more robust.

        Software Zen: delete this;

        H 1 Reply Last reply
        0
        • G Gary R Wheeler

          Because the second fragment duplicates knowledge of the loop's termination condition. You have to remember to adjust it in two places. The first fragment is therefore more robust.

          Software Zen: delete this;

          H Offline
          H Offline
          honey the codewitch
          wrote on last edited by
          #31

          yep. although there are cases where I'll modify i inside the loop for other reasons. Like if I have to add or remove items while enumerating (it happens with complicated algos)

          When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

          G 1 Reply Last reply
          0
          • H honey the codewitch

            why do this?

            for(int i = 0;i
            instead of

            for(int i = 0;i

            hengh?? why you still use break?

            :laugh:

            When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

            L Offline
            L Offline
            Lost User
            wrote on last edited by
            #32

            Yours is BS because it will execute everything after the if.

            H 1 Reply Last reply
            0
            • L Lost User

              Yours is BS because it will execute everything after the if.

              H Offline
              H Offline
              honey the codewitch
              wrote on last edited by
              #33

              It was sample code. Normally you'd account for that when you put actual code in there, but without putting anything in there, it's not for me to know where the actual break should happen. However, it was sort of written with the idea that it would follow the main loop logic, kind of like the break example would. Of course the control flow is slightly different, but it's not irreconcilably different. if you need something to go after the conditional check, you'd wrap whatever went after the break in the one example in an else block instead.

              When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

              L 1 Reply Last reply
              0
              • H honey the codewitch

                It was sample code. Normally you'd account for that when you put actual code in there, but without putting anything in there, it's not for me to know where the actual break should happen. However, it was sort of written with the idea that it would follow the main loop logic, kind of like the break example would. Of course the control flow is slightly different, but it's not irreconcilably different. if you need something to go after the conditional check, you'd wrap whatever went after the break in the one example in an else block instead.

                When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                L Offline
                L Offline
                Lost User
                wrote on last edited by
                #34

                Yeas it the simpliest possible 5 lines code. In real life you would probably have another couple of hundreds lines of similar mess entagled there, with some poor soul wondering why is this piece of crap executing when it was not supposed to.

                H 1 Reply Last reply
                0
                • L Lost User

                  Yeas it the simpliest possible 5 lines code. In real life you would probably have another couple of hundreds lines of similar mess entagled there, with some poor soul wondering why is this piece of crap executing when it was not supposed to.

                  H Offline
                  H Offline
                  honey the codewitch
                  wrote on last edited by
                  #35

                  :laugh: it's funny cuz it's true. For the record, I'm not endorsing the method i described, I'm simply being facetious about it. I think it's silly. A break statement is much clearer, which was kind of the point of my OP. Sometimes you need break. Or a continue. Or even a goto (which i can give a solid use case for - in this case making the code MORE readable)

                  When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                  L 1 Reply Last reply
                  0
                  • H honey the codewitch

                    :laugh: it's funny cuz it's true. For the record, I'm not endorsing the method i described, I'm simply being facetious about it. I think it's silly. A break statement is much clearer, which was kind of the point of my OP. Sometimes you need break. Or a continue. Or even a goto (which i can give a solid use case for - in this case making the code MORE readable)

                    When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                    L Offline
                    L Offline
                    Lost User
                    wrote on last edited by
                    #36

                    Alright, here a piece of advice: never exit conditionally a for cycle. if you need to do that, use while or do until.

                    H 1 Reply Last reply
                    0
                    • L Lost User

                      Alright, here a piece of advice: never exit conditionally a for cycle. if you need to do that, use while or do until.

                      H Offline
                      H Offline
                      honey the codewitch
                      wrote on last edited by
                      #37

                      i think it depends on the situation for example

                      public int IndexOf(T item)
                      {
                      var ic = Count;
                      var i = 0;
                      for(;i

                      That's very clear even without comments

                      When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                      L 1 Reply Last reply
                      0
                      • H honey the codewitch

                        i think it depends on the situation for example

                        public int IndexOf(T item)
                        {
                        var ic = Count;
                        var i = 0;
                        for(;i

                        That's very clear even without comments

                        When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                        L Offline
                        L Offline
                        Lost User
                        wrote on last edited by
                        #38

                        i=-1 do i++ until Equals(item,this[i]) return i

                        H 1 Reply Last reply
                        0
                        • L Lost User

                          i=-1 do i++ until Equals(item,this[i]) return i

                          H Offline
                          H Offline
                          honey the codewitch
                          wrote on last edited by
                          #39

                          i mean yeah. That's a little less clear to me though. I avoid do loops usually because the conditional can get confusing if you're used to regular for loops. It takes me a second to work out what's going on, like when exactly the condition exits. It's not big deal, it's just my preference. I think my code is clearer.

                          When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                          L 1 Reply Last reply
                          0
                          • H honey the codewitch

                            i mean yeah. That's a little less clear to me though. I avoid do loops usually because the conditional can get confusing if you're used to regular for loops. It takes me a second to work out what's going on, like when exactly the condition exits. It's not big deal, it's just my preference. I think my code is clearer.

                            When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                            L Offline
                            L Offline
                            Lost User
                            wrote on last edited by
                            #40

                            It is simpler and I actually use pretty much exactly the same code when it is that simple. When you have more than a page of lines within that loop a sudden exit is not what I would do. And a sudden conditional exit with break or return might be even ok. Putting the i to the max and then exit in that manner is something I would never do.

                            H 1 Reply Last reply
                            0
                            • L Lost User

                              It is simpler and I actually use pretty much exactly the same code when it is that simple. When you have more than a page of lines within that loop a sudden exit is not what I would do. And a sudden conditional exit with break or return might be even ok. Putting the i to the max and then exit in that manner is something I would never do.

                              H Offline
                              H Offline
                              honey the codewitch
                              wrote on last edited by
                              #41

                              well to each their own. probably it also has to do with my C++ background which influences a lot of my code. Not that C++ has different flow constructs, it's just that a) i learned these habits a long time ago and the industry changes b) C++ development is a different animal, and control flow is all over the place generally and for loops are used for almost everything except while(true) although some people go for(;;). It's not uncommon even to do stuff like for(current=firstNode;null!=current;current=current.nextNode) if(current->key==key) break; to traverse a linked list for example.

                              When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                              1 Reply Last reply
                              0
                              • H honey the codewitch

                                yep. although there are cases where I'll modify i inside the loop for other reasons. Like if I have to add or remove items while enumerating (it happens with complicated algos)

                                When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                G Offline
                                G Offline
                                Gary R Wheeler
                                wrote on last edited by
                                #42

                                That makes sense, especially given the type of algorithms you deal with in parsers and data structures. In the course of developing several large, complex applications, I've learned that having pieces of code that must stay in sync logically or follow the same algorithm is a failure point. Refactoring can help if i makes sense to move things into a method, and then have each location invoke the method. The hard part there can be figuring out a name for the thing: "CheckToSeeIfMessageNeededAtThreadExit" is ugly :-D.

                                Software Zen: delete this;

                                H 1 Reply Last reply
                                0
                                • G Gary R Wheeler

                                  That makes sense, especially given the type of algorithms you deal with in parsers and data structures. In the course of developing several large, complex applications, I've learned that having pieces of code that must stay in sync logically or follow the same algorithm is a failure point. Refactoring can help if i makes sense to move things into a method, and then have each location invoke the method. The hard part there can be figuring out a name for the thing: "CheckToSeeIfMessageNeededAtThreadExit" is ugly :-D.

                                  Software Zen: delete this;

                                  H Offline
                                  H Offline
                                  honey the codewitch
                                  wrote on last edited by
                                  #43

                                  right. Extract Method is one of my favorite refactoring tools I don't use incredibly long names for private methods. I'll abbreviate something like the above to _CheckMessageThread() Public members i usually go all out, and give it a really long name if it needs one.

                                  When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                  1 Reply Last reply
                                  0
                                  • H honey the codewitch

                                    why do this?

                                    for(int i = 0;i
                                    instead of

                                    for(int i = 0;i

                                    hengh?? why you still use break?

                                    :laugh:

                                    When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                    S Offline
                                    S Offline
                                    SwitcherSoft
                                    wrote on last edited by
                                    #44

                                    A purist should be worried about touching control variables. Hmmm.

                                    Jordan

                                    1 Reply Last reply
                                    0
                                    • H honey the codewitch

                                      ugh, VB. I use goto in some of my code. Perfectly acceptable place to use GOTO - generated state machine code:

                                      public static bool AcceptsByte(Grimoire.ParseContext pc)
                                      {
                                      pc.EnsureStarted();
                                      if (-1 == pc.Current) return false;
                                      if ((48 == pc.Current))
                                      {
                                      pc.Advance();
                                      goto AcceptsByte_s1;
                                      }
                                      if ((49 == pc.Current))
                                      {
                                      pc.Advance();
                                      goto AcceptsByte_s2;
                                      }
                                      if ((50 == pc.Current))
                                      {
                                      pc.Advance();
                                      goto AcceptsByte_s4;
                                      }
                                      if ((51 <= pc.Current && 57 >= pc.Current))
                                      {
                                      pc.Advance();
                                      goto AcceptsByte_s3;
                                      }
                                      return false;
                                      AcceptsByte_s1:
                                      if (-1 == pc.Current) return true;
                                      return -1 == pc.Advance();
                                      AcceptsByte_s2:
                                      if (-1 == pc.Current) return true;
                                      if ((48 <= pc.Current && 57 >= pc.Current))
                                      {
                                      pc.Advance();
                                      goto AcceptsByte_s3;
                                      }
                                      return -1 == pc.Advance();
                                      AcceptsByte_s3:
                                      if (-1 == pc.Current) return true;
                                      if ((48 <= pc.Current && 57 >= pc.Current))
                                      {
                                      pc.Advance();
                                      goto AcceptsByte_s1;
                                      }
                                      return -1 == pc.Advance();
                                      AcceptsByte_s4:
                                      if (-1 == pc.Current) return true;
                                      if ((48 <= pc.Current && 52 >= pc.Current))
                                      {
                                      pc.Advance();
                                      goto AcceptsByte_s3;
                                      }
                                      if ((53 == pc.Current))
                                      {
                                      pc.Advance();
                                      goto AcceptsByte_s5;
                                      }
                                      if ((54 <= pc.Current && 57 >= pc.Current))
                                      {
                                      pc.Advance();
                                      goto AcceptsByte_s1;
                                      }
                                      return -1 == pc.Advance();
                                      AcceptsByte_s5:
                                      if (-1 == pc.Current) return true;
                                      if ((48 <= pc.Current && 52 >= pc.Current))
                                      {
                                      pc.Advance();
                                      goto AcceptsByte_s1;
                                      }
                                      return -1 == pc.Advance();
                                      }

                                      but then I wouldn't write that code by hand. Too error prone.

                                      When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                      J Offline
                                      J Offline
                                      John Brett
                                      wrote on last edited by
                                      #45

                                      Quote:

                                      but then I wouldn't write that code by hand. Too error prone.

                                      Isn't this exactly the point? All code gets compiled/interpreted/translated to jmps eventually. The goals of the written code should be correctness, understandability and simplicity. Leave the gotos and the clever techniques to the compiler.

                                      A H 2 Replies Last reply
                                      0
                                      • L Lost User

                                        throw would be even more clear, definite and failure proof. (well I do see many kids using exactly that to 'not use goto endlabel')

                                        Message Signature (Click to edit ->)

                                        K Offline
                                        K Offline
                                        kalberts
                                        wrote on last edited by
                                        #46

                                        If finding the desired value is exceptional and unexpected and requiring special handling, then throwing an exception is appropriate. If it is the normal and desired case, exeactly what you expected: "Yeah, there it is!", then an exception is not the right mechanism.

                                        1 Reply Last reply
                                        0
                                        • H honey the codewitch

                                          why do this?

                                          for(int i = 0;i
                                          instead of

                                          for(int i = 0;i

                                          hengh?? why you still use break?

                                          :laugh:

                                          When I was growin' up, I was the smartest kid I knew. Maybe that was just because I didn't know that many kids. All I know is now I feel the opposite.

                                          T Offline
                                          T Offline
                                          t j home
                                          wrote on last edited by
                                          #47

                                          break is (of course) superfluous - but why not try something that suggests the intention of your loop?

                                          for(int i = 0;i

                                          ... or (because I don't like "empty" constructs) ...

                                          int i = 0;
                                          while (i

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups