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. Programming Lesson of the Day

Programming Lesson of the Day

Scheduled Pinned Locked Moved The Lounge
c++question
44 Posts 21 Posters 0 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.
  • K Kirill Illenseer

    Actually, the result is the same. The side-effects aren't. At least in C#. In C, with it's enforced type-unsafety, the result can be extremey weird and the compiler won't do jack to even warn you.

    D Offline
    D Offline
    den2k88
    wrote on last edited by
    #20

    No. Example 2 & 4 is 0 2 && is 1 (true) In that case I needed the first form as I was checking for a flag in a flag register, but mistakenly used the second form due to, well, being the most common (althought not so much in my field, which requires the management of a lot of driverless hardware).

    CALL APOGEE, SAY AARDWOLF GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++*      Weapons extension: ma- k++ F+2 X If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver "Go ahead, make my day"

    K 1 Reply Last reply
    0
    • K KarstenK

      Depending on the correct implementation of the "&" and "&&" operators in a fat class it shouldnt be the same :rolleyes:

      Press F1 for help or google it. Greetings from Germany

      D Offline
      D Offline
      den2k88
      wrote on last edited by
      #21

      Plain C operators - it was a stupid mistake from my part, on the same day I made at least 3 mistakes of >= vs >. It wasn just the day - in fact I'm on sick leave today due to a strong headache I've been coddling since yesterday evening. Probably I was starting to feel it's effects in the morning too :D

      CALL APOGEE, SAY AARDWOLF GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++*      Weapons extension: ma- k++ F+2 X If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver "Go ahead, make my day"

      1 Reply Last reply
      0
      • J Jeremy Falcon

        Just to expand on Richard's point... I'm more of a C guy than C#, but like with C/C++ I can only assume that in this case, the compiler is doing a binary operation of AND, and 1 (or any non-zero) AND 0 is always going to be zero, which is expressed as false in this case. It's the difference between a bitwise operator and a logical one.

        Jeremy Falcon

        D Offline
        D Offline
        den2k88
        wrote on last edited by
        #22

        Precisely, since I'm using both in the same code (hw management) I made my Dumb Mistake Of The Day :D

        CALL APOGEE, SAY AARDWOLF GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++*      Weapons extension: ma- k++ F+2 X If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver "Go ahead, make my day"

        1 Reply Last reply
        0
        • I irneb

          Jeremy Falcon wrote:

          I reckon the difference being the compiler knows that's an assignment operator.

          Nope, it's because both C# and Java are more type safe (strong typed) than C is. In this case they define a boolean type, C just interprets an integer to have similar "meaning" to a boolean. And the if statement (in C#/Java) requires a boolean input argument. It's the same sort of situation as sending a string into a function which expected a float - compiler error - wrong type. This is an example of where C uses a weak typing system. It generally just uses the raw data as if it's in the expected type. Effectively turning it into a raw type-cast. The more strongly typed languages disallow most of these, probably because they tend to be the reason behind lots of bugs (if not most).

          D Offline
          D Offline
          den2k88
          wrote on last edited by
          #23

          At the same time C# is too rigid, especially with data which may have to be taken as raw (like a read from another process' memory) and read differently depending on other circumstances. I had to develop a C# plugin for VS that allowed me to visualize 8 bits or 16 bits grayscale images taken from the memory of a debugged process, either completely raw with parameters (height, width, bitsperpixel) inserted manually or taken from a standard structure we use in our codebase, which was stored in memory. Doing the necessary casts was freaking tough and required craptons of code and workarounds, while with C it would have been immediate. I prefer the need of more attention of C towards the need of knowing a stupid framework as with .NET languages - a poorly documented framework BTW since while every method and object is documented there isn't single piece of documentation explaining WEHN to use a particular namespace/object instead of a similarly named one, which are the related structures/objects/methods... compare that to Win32 APIs documentation.

          CALL APOGEE, SAY AARDWOLF GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++*      Weapons extension: ma- k++ F+2 X If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver "Go ahead, make my day"

          H I A 3 Replies Last reply
          0
          • D den2k88

            At the same time C# is too rigid, especially with data which may have to be taken as raw (like a read from another process' memory) and read differently depending on other circumstances. I had to develop a C# plugin for VS that allowed me to visualize 8 bits or 16 bits grayscale images taken from the memory of a debugged process, either completely raw with parameters (height, width, bitsperpixel) inserted manually or taken from a standard structure we use in our codebase, which was stored in memory. Doing the necessary casts was freaking tough and required craptons of code and workarounds, while with C it would have been immediate. I prefer the need of more attention of C towards the need of knowing a stupid framework as with .NET languages - a poorly documented framework BTW since while every method and object is documented there isn't single piece of documentation explaining WEHN to use a particular namespace/object instead of a similarly named one, which are the related structures/objects/methods... compare that to Win32 APIs documentation.

            CALL APOGEE, SAY AARDWOLF GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++*      Weapons extension: ma- k++ F+2 X If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver "Go ahead, make my day"

            H Offline
            H Offline
            Herbie Mountjoy
            wrote on last edited by
            #24

            I find the strong typing of C# is more of a help than a hindrance. Back in my C days I would get into horrible tangles doing precisely what you are trying to do. An int is not a bool even though many programmers of the era would treat them alike. I still encounter data tables that have integers or even strings used as boolean values and it makes my skin crawl.

            We're philosophical about power outages here. A.C. come, A.C. go.

            E D 2 Replies Last reply
            0
            • D den2k88

              X & Y

              is not the same as

              X && Y

              Twenty minutes wasted on a condition who refused to yield the correct result.

              CALL APOGEE, SAY AARDWOLF GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++*      Weapons extension: ma- k++ F+2 X If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver "Go ahead, make my day"

              G Offline
              G Offline
              Gary Wheeler
              wrote on last edited by
              #25

              Don't feel bad. I once had a bug based on this very thing that took weeks to find.

              Software Zen: delete this;

              1 Reply Last reply
              0
              • D den2k88

                At the same time C# is too rigid, especially with data which may have to be taken as raw (like a read from another process' memory) and read differently depending on other circumstances. I had to develop a C# plugin for VS that allowed me to visualize 8 bits or 16 bits grayscale images taken from the memory of a debugged process, either completely raw with parameters (height, width, bitsperpixel) inserted manually or taken from a standard structure we use in our codebase, which was stored in memory. Doing the necessary casts was freaking tough and required craptons of code and workarounds, while with C it would have been immediate. I prefer the need of more attention of C towards the need of knowing a stupid framework as with .NET languages - a poorly documented framework BTW since while every method and object is documented there isn't single piece of documentation explaining WEHN to use a particular namespace/object instead of a similarly named one, which are the related structures/objects/methods... compare that to Win32 APIs documentation.

                CALL APOGEE, SAY AARDWOLF GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++*      Weapons extension: ma- k++ F+2 X If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver "Go ahead, make my day"

                I Offline
                I Offline
                irneb
                wrote on last edited by
                #26

                Don't get me wrong ... I'm not dissing on C and saying C# is all that great. I was simply pointing out why the if statement would fail to even compile in this particular case when trying this in C#. You make a point where C#'s strong typing does make a programmer's life more cumbersome - you'd need to convert a byte array into specific types to do what you want, though there is readily available built-in libraries for that, or you could use an unsafe code block and use pointers to cast one into the other (just like you'd have done in C). Point is it would make for more coding to achieve the same thing. Though it's only in special circumstances (like your example) where this is beneficial. Nearly everywhere else it means there's less to think about (and guard against) due to the compiler checking types for you. If you find you constantly run into situations where you need to cast between types - then perhaps C# isn't the correct tool for the job and you'd be better off with C instead.

                D 1 Reply Last reply
                0
                • D den2k88

                  "If I put in wrong data, will the result be correct?"

                  CALL APOGEE, SAY AARDWOLF GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++*      Weapons extension: ma- k++ F+2 X If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver "Go ahead, make my day"

                  P Offline
                  P Offline
                  PIEBALDconsult
                  wrote on last edited by
                  #27

                  Yes, but unexpected.

                  1 Reply Last reply
                  0
                  • H Herbie Mountjoy

                    I find the strong typing of C# is more of a help than a hindrance. Back in my C days I would get into horrible tangles doing precisely what you are trying to do. An int is not a bool even though many programmers of the era would treat them alike. I still encounter data tables that have integers or even strings used as boolean values and it makes my skin crawl.

                    We're philosophical about power outages here. A.C. come, A.C. go.

                    E Offline
                    E Offline
                    englebart
                    wrote on last edited by
                    #28

                    Remember that C was designed to replace assembly. Common assembly directives are things like "Branch if equal to 0", "Branch if not equal to 0", etc. No Booleans in assembly. In C, a string "abc" is really just the address of the letter 'a' in memory. So it is not really a "boolean", You are just asking the compiler is the address NULL (0) or not. char * str1 = "abc"; char * str2 = NULL; // #define NULL 0 if (str1) { /* will execute */ } if (str2) { /* will NOT execute */ }

                    1 Reply Last reply
                    0
                    • Richard DeemingR Richard Deeming

                      Programming Lesson of the Day #3: Check your assumptions before posting them as a lesson! ;P

                      bool x = true;
                      bool y = false;
                      (x & y).Dump(); // Output: False

                      It's not commonly used, but for booleans, & is the non-short-circuiting version of &&. It's the C# equivalent of VB.NET's And, whereas && equates to AndAlso.

                      & Operator (C# Reference)[^]:

                      Binary & operators are predefined for the integral types and bool. ... For bool operands, & computes the logical AND of its operands; that is, the result is true if and only if both its operands are true. The & operator evaluates both operators regardless of the first one's value.


                      "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                      K Offline
                      K Offline
                      kdmote
                      wrote on last edited by
                      #29

                      OK, my turn to learn something new: What's Dump()?

                      J Richard DeemingR 2 Replies Last reply
                      0
                      • D den2k88

                        At the same time C# is too rigid, especially with data which may have to be taken as raw (like a read from another process' memory) and read differently depending on other circumstances. I had to develop a C# plugin for VS that allowed me to visualize 8 bits or 16 bits grayscale images taken from the memory of a debugged process, either completely raw with parameters (height, width, bitsperpixel) inserted manually or taken from a standard structure we use in our codebase, which was stored in memory. Doing the necessary casts was freaking tough and required craptons of code and workarounds, while with C it would have been immediate. I prefer the need of more attention of C towards the need of knowing a stupid framework as with .NET languages - a poorly documented framework BTW since while every method and object is documented there isn't single piece of documentation explaining WEHN to use a particular namespace/object instead of a similarly named one, which are the related structures/objects/methods... compare that to Win32 APIs documentation.

                        CALL APOGEE, SAY AARDWOLF GCS d--- s-/++ a- C++++ U+++ P- L- E-- W++ N++ o+ K- w+++ O? M-- V? PS+ PE- Y+ PGP t++ 5? X R++ tv-- b+ DI+++ D++ G e++>+++ h--- ++>+++ y+++*      Weapons extension: ma- k++ F+2 X If you think 'goto' is evil, try writing an Assembly program without JMP. -- TNCaver "Go ahead, make my day"

                        A Offline
                        A Offline
                        Alister Morton
                        wrote on last edited by
                        #30

                        Processing OSC packets (for example) is a doddle in C/C++ but somewhat cumbersome in C#

                        1 Reply Last reply
                        0
                        • Richard DeemingR Richard Deeming

                          Programming Lesson of the Day #3: Check your assumptions before posting them as a lesson! ;P

                          bool x = true;
                          bool y = false;
                          (x & y).Dump(); // Output: False

                          It's not commonly used, but for booleans, & is the non-short-circuiting version of &&. It's the C# equivalent of VB.NET's And, whereas && equates to AndAlso.

                          & Operator (C# Reference)[^]:

                          Binary & operators are predefined for the integral types and bool. ... For bool operands, & computes the logical AND of its operands; that is, the result is true if and only if both its operands are true. The & operator evaluates both operators regardless of the first one's value.


                          "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                          S Offline
                          S Offline
                          Slow Eddie
                          wrote on last edited by
                          #31

                          Great tip and explanation. I am currently teaching myself C# and this is extremely helpful.

                          A giraffe is a horse designed by a committee... ... or an Agile methodology...

                          1 Reply Last reply
                          0
                          • K kdmote

                            OK, my turn to learn something new: What's Dump()?

                            J Offline
                            J Offline
                            James Curran
                            wrote on last edited by
                            #32

                            `Dump()` is an extension method added to all objects within LinqPad. LinqPad is a tool which allows writing & compiling simple C# code snippets (plus a bunch of other things). (And the basic version is free: www.linqpad.com )

                            Truth, James

                            K 1 Reply Last reply
                            0
                            • J Jeremy Falcon

                              Oh I hear ya man. I reckon the difference being the compiler knows that's an assignment operator. My understanding of the way C# and Java does things is to create an object where needed from literals / constants / expressions. So, it would be more like this...

                              "Hello, world!".ToUpper()

                              ...just instead of a string it's a false... which gets treated like a boolean.

                              Jeremy Falcon

                              J Offline
                              J Offline
                              James Curran
                              wrote on last edited by
                              #33

                              No, it's the use of an int as a boolean that C# complains about. The assignment in the if() is fine, provided it's a boolean:

                              bool x = false;

                              if (x = true)
                              "It's True".Dump();

                              Truth, James

                              1 Reply Last reply
                              0
                              • K kdmote

                                OK, my turn to learn something new: What's Dump()?

                                Richard DeemingR Offline
                                Richard DeemingR Offline
                                Richard Deeming
                                wrote on last edited by
                                #34

                                It's an extension method provided by LINQPad[^]. EDIT: I'm sure James' response wasn't there when I posted this! :doh:


                                "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                                "These people looked deep within my soul and assigned me a number based on the order in which I joined" - Homer

                                J 1 Reply Last reply
                                0
                                • OriginalGriffO OriginalGriff

                                  Programming Lesson of the Day #2: If you'd used C# it wouldn't have compiled ... :laugh:

                                  Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...

                                  S Offline
                                  S Offline
                                  sasadler
                                  wrote on last edited by
                                  #35

                                  Heh, I'd like to use C# but as an embedded developer (using TI DSPs) it's not really an option for me. It's C/C++ or DSP assembly (which nobody in their right mind wants to do!!!!).

                                  1 Reply Last reply
                                  0
                                  • I irneb

                                    Jeremy Falcon wrote:

                                    I reckon the difference being the compiler knows that's an assignment operator.

                                    Nope, it's because both C# and Java are more type safe (strong typed) than C is. In this case they define a boolean type, C just interprets an integer to have similar "meaning" to a boolean. And the if statement (in C#/Java) requires a boolean input argument. It's the same sort of situation as sending a string into a function which expected a float - compiler error - wrong type. This is an example of where C uses a weak typing system. It generally just uses the raw data as if it's in the expected type. Effectively turning it into a raw type-cast. The more strongly typed languages disallow most of these, probably because they tend to be the reason behind lots of bugs (if not most).

                                    J Offline
                                    J Offline
                                    Jeremy Falcon
                                    wrote on last edited by
                                    #36

                                    Makes sense.

                                    Jeremy Falcon

                                    1 Reply Last reply
                                    0
                                    • J James Curran

                                      `Dump()` is an extension method added to all objects within LinqPad. LinqPad is a tool which allows writing & compiling simple C# code snippets (plus a bunch of other things). (And the basic version is free: www.linqpad.com )

                                      Truth, James

                                      K Offline
                                      K Offline
                                      kdmote
                                      wrote on last edited by
                                      #37

                                      :thumbsup:

                                      1 Reply Last reply
                                      0
                                      • OriginalGriffO OriginalGriff

                                        And I've learned something today! Thank you - I didn't know that. :thumbsup:

                                        Bad command or file name. Bad, bad command! Sit! Stay! Staaaay...

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

                                        A massive recall of all existing code is being contemplated... Warning: "|" is also not the same as "||".

                                        "(I) am amazed to see myself here rather than there ... now rather than then". ― Blaise Pascal

                                        D 1 Reply Last reply
                                        0
                                        • Richard DeemingR Richard Deeming

                                          It's an extension method provided by LINQPad[^]. EDIT: I'm sure James' response wasn't there when I posted this! :doh:


                                          "These people looked deep within my soul and assigned me a number based on the order in which I joined." - Homer

                                          J Offline
                                          J Offline
                                          James Curran
                                          wrote on last edited by
                                          #39

                                          >

                                          I'm sure James' response wasn't there when I posted this!

                                          Well, at least you got the URL right....

                                          Truth, James

                                          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