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. General Programming
  3. C / C++ / MFC
  4. while (*p++);

while (*p++);

Scheduled Pinned Locked Moved C / C++ / MFC
21 Posts 9 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.
  • C Chintoo723

    How do you interpret this: while (*p++);

    C Offline
    C Offline
    Carsten Leue
    wrote on last edited by
    #11

    If p initially points to a character string then after while(*p++); p points to the 0 character that terminates the string. So it is semantically the same as p = p + _tcslen(p);

    C 1 Reply Last reply
    0
    • J John R Shaw

      I am surprised I even looked at that code. What I showed you was a litteral interpretation of the code you presented. I could even present it in assembly if required (which I will not do). Let's break it down: 1) Copy the current value into a temporary variable. 2) Increment the current value. 3) Check if the temporary value has a value other than zero. If it does not then stop looping. That is how it works! INTP Every thing is relative...

      C Offline
      C Offline
      Chintoo723
      wrote on last edited by
      #12

      With your solution p will point to the first NULL from the beginning, which is not really correct. it will point to the char after the first null. try to trace it and see. but be careful with the string you use, or your program might crash. for eg, use "a\0bb\0ccc\0\0dddd" I can understand, the code is very deceptive. only a few get it right the first time, and I am not one of them either :) thanks!

      J 1 Reply Last reply
      0
      • C Carsten Leue

        If p initially points to a character string then after while(*p++); p points to the 0 character that terminates the string. So it is semantically the same as p = p + _tcslen(p);

        C Offline
        C Offline
        Chintoo723
        wrote on last edited by
        #13

        Carsten Leue wrote:

        p = p + _tcslen(p);

        Welcome to the gang! you too got it incorrect :) it, actually, is equivalent to : p= p + _tcslen(p) + 1 thanks!

        C 1 Reply Last reply
        0
        • C Chintoo723

          How do you interpret this: while (*p++);

          T Offline
          T Offline
          TheGreatAndPowerfulOz
          wrote on last edited by
          #14

          step 1. obtain value of object pointed to by "p" step 2. increment "p" step 3. if value evaluates to "true" then execute statement and continue with step 1 step 4. stop

          T 1 Reply Last reply
          0
          • T TheGreatAndPowerfulOz

            step 1. obtain value of object pointed to by "p" step 2. increment "p" step 3. if value evaluates to "true" then execute statement and continue with step 1 step 4. stop

            T Offline
            T Offline
            TheGreatAndPowerfulOz
            wrote on last edited by
            #15

            equivalent code:

            while (true)
            {
                bool done = *p == 0;
                ++p;
                if (done) break;
            }
            
            C 1 Reply Last reply
            0
            • A Anonymous

              that someone is none other than a micrsoft sample code. This piece of code is from: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/fileio/fs/obtaining\_a\_file\_name\_from\_a\_file\_handle.asp where p initially points to a: A:\\0C:\\0D:\\0\0 where \0 represents a single NULL character. I dont understand what you maen by *p = 0, but this piece of code doesnt modify any data, only pointer advancement. and how that works is still mysterious to me.

              C Offline
              C Offline
              Christian Graus
              wrote on last edited by
              #16

              It actually does the ++ first, which means that it increments the pointer until it points to NULL. Christian Graus - Microsoft MVP - C++

              C 1 Reply Last reply
              0
              • C Christian Graus

                It actually does the ++ first, which means that it increments the pointer until it points to NULL. Christian Graus - Microsoft MVP - C++

                C Offline
                C Offline
                Chintoo723
                wrote on last edited by
                #17

                Christian Graus wrote:

                It actually does the ++ first, which means that it increments the pointer until it points to NULL.

                Welcome to the gang! you are not alone :) PS: check out other posts thanks!

                1 Reply Last reply
                0
                • T TheGreatAndPowerfulOz

                  equivalent code:

                  while (true)
                  {
                      bool done = *p == 0;
                      ++p;
                      if (done) break;
                  }
                  
                  C Offline
                  C Offline
                  Chintoo723
                  wrote on last edited by
                  #18

                  Roger, Sunit, Ahz- you guys are awesome! Does this example fit an obfuscated C contest? :) thanks!

                  T 1 Reply Last reply
                  0
                  • C Chintoo723

                    Roger, Sunit, Ahz- you guys are awesome! Does this example fit an obfuscated C contest? :) thanks!

                    T Offline
                    T Offline
                    TheGreatAndPowerfulOz
                    wrote on last edited by
                    #19

                    Lambu Jindu wrote:

                    Does this example fit an obfuscated C contest?

                    no

                    1 Reply Last reply
                    0
                    • C Chintoo723

                      Carsten Leue wrote:

                      p = p + _tcslen(p);

                      Welcome to the gang! you too got it incorrect :) it, actually, is equivalent to : p= p + _tcslen(p) + 1 thanks!

                      C Offline
                      C Offline
                      Carsten Leue
                      wrote on last edited by
                      #20

                      It's a bummer! You are correct. The loop ends if p points to the end of the string but p is still incremented. Carsten

                      1 Reply Last reply
                      0
                      • C Chintoo723

                        With your solution p will point to the first NULL from the beginning, which is not really correct. it will point to the char after the first null. try to trace it and see. but be careful with the string you use, or your program might crash. for eg, use "a\0bb\0ccc\0\0dddd" I can understand, the code is very deceptive. only a few get it right the first time, and I am not one of them either :) thanks!

                        J Offline
                        J Offline
                        John R Shaw
                        wrote on last edited by
                        #21

                        Lets make it more accurate then:

                        // UNOPTIMIZED
                        //////////////////////////
                        343: char* p = "123";
                        0043CA51 mov dword ptr [ebp-14h],offset string "123" (004df014)
                        344: while( *p++ ) {};
                        0043CA58 mov eax,dword ptr [ebp-14h] // eax <- p
                        0043CA5B movsx ecx,byte ptr [eax] // value_type = p[0];
                        0043CA5E mov edx,dword ptr [ebp-14h] // edx <- p
                        0043CA61 add edx,1 // edx <- edx + 1
                        0043CA64 mov dword ptr [ebp-14h],edx // p <- edx
                        0043CA67 test ecx,ecx // if( ecx is 0 )
                        0043CA69 je main+4Dh (0043ca6d) // goto 0043CA6D
                        0043CA6B jmp main+38h (0043ca58) // goto 0043CA51
                        345: return 0;
                        0043CA6D xor eax,eax
                        0043CA6F jmp __tryend$_main$1+2Ch (0043cac0)

                        // UNOPTIMIZED
                        START_LOOP:
                        value_type = *p;
                        ++p;
                        if( value_type == 0 )
                        goto END_LOOP;
                        goto START_LOOP;
                        END_LOOP:

                        INTP Every thing is relative...

                        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