• SavvyWolf@pawb.social
    link
    fedilink
    English
    arrow-up
    45
    arrow-down
    1
    ·
    17 hours ago

    You actually shouldn’t do this!

    This doesn’t introduce a new scope, so accidentally using x outside of the case block is UB. Instead you should introduce a new scope like so:

    switch (foo)  {
      case BAZ: {
        int x = ...;
        foobar(x);
      }
    }
    
    • Victor@lemmy.world
      link
      fedilink
      arrow-up
      3
      ·
      9 hours ago

      Is “case expr:” really a label? You could put anything in there, like “case 42:”. I don’t see a label, but maybe I don’t know what a label is in C.

      • TwilightKiddy@scribe.disroot.org
        link
        fedilink
        English
        arrow-up
        1
        ·
        2 hours ago

        In C# it’s certainly a label, it’s the same syntax and you can also jump to them with goto, which is actually very convenient sometimes. As far as I know this is an ancient feature and seeing how early C# was mostly inspired by C, I would expect it to behave the same way there.

  • treadful@lemmy.zip
    link
    fedilink
    English
    arrow-up
    15
    ·
    23 hours ago

    What does assigning ... do in C? Is that just default type value or something?

    • Victoria@lemmy.blahaj.zone
      link
      fedilink
      English
      arrow-up
      34
      ·
      23 hours ago

      from what i could find “because it was designed that way”

      For what it’s worth, C23 has updated labels to allow being placed before declarations.

    • sik0fewl@piefed.ca
      link
      fedilink
      English
      arrow-up
      15
      ·
      23 hours ago

      Possibly because declarations were originally not statements in C? You could only declare variables at the start of a function, but not assign them to something at the same time.

      Not sure why it still wouldn’t be allowed, though, especially if an empty statement can be a statement.

      • balsoft@lemmy.ml
        link
        fedilink
        arrow-up
        8
        ·
        19 hours ago

        I think it evolved like that:

        1. Declarations are separate entities to statements, because declarations do not translate to a machine code instruction
        2. Labels only make sense when attached to statements because they need to point to a particular machine code instruction <-- This should have been changed at least when declarations were allowed to be mixed with statements in compound statements
        3. Definitions are declarations plus an assignment, let’s make them a subset of a declaration <-- I think this is the biggest mistake of them all
        4. “Well, it’s already been that way for 40 years, too late to change it now!”
    • terranoid@lemmy.cafe
      link
      fedilink
      English
      arrow-up
      5
      ·
      22 hours ago

      When it’s designed to be an expression

      while (int x = 1) { ... Modify x to eventually be zero... }
      

      That might make sense even if it looks weird. Kinda like a for loop.