can somebody confirm this pls?

21 days ago by gandalf_der_13te to c/programmer_humor

savvywolf 63 points 21 days 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);
  }
}
path: 0 25937348, hotness: undefined, score: 63, children: 0
ASoftGlow 19 points 21 days ago

Can confirm

path: 0 25934131, hotness: undefined, score: 19, children: 4
victorz 5 points 21 days 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.

path: 0 25934131 25944337, hotness: undefined, score: 5, children: 3
TwilightKiddy 1 point 21 days 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.

path: 0 25934131 25944337 25949495, hotness: undefined, score: 1, children: 2
victorz 1 point 20 days ago

What?

If I have a case 42: in C#, I can issue a goto 42 and resume execution after that case? Or how would that work?

From what I know, labels are only an identifier followed by a colon, like:

stop: printf("stopped.\n");

Or just the label and colon on one line and statements following on subsequent lines. I've never seen a switch case expression being called a "label". Very new to me. Would love to see a minimal demonstration example. 🙏

Edit: huh, I guess you can.

path: 0 25934131 25944337 25949495 25951798, hotness: undefined, score: 1, children: 1
TwilightKiddy 3 points 20 days ago

Yes, you would do goto case 42;
From MSDN:

private static decimal CalculatePrice(CoffeeChoice choice)
{
    decimal price = 0;
    switch (choice)
    {
        case CoffeeChoice.Plain:
            price += 10.0m;
            break;

        case CoffeeChoice.WithMilk:
            price += 5.0m;
            goto case CoffeeChoice.Plain;

        case CoffeeChoice.WithIceCream:
            price += 7.0m;
            goto case CoffeeChoice.Plain;
    }
    return price;
}
path: 0 25934131 25944337 25949495 25951798 25958153, hotness: undefined, score: 3, children: 0
treadful 17 points 21 days ago

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

path: 0 25934200, hotness: undefined, score: 17, children: 3
gratux 58 points 21 days ago

probably just placeholder because what is actually assigned isn't relevant to the post

path: 0 25934200 25934256, hotness: undefined, score: 58, children: 0
gandalf_der_13te 33 points 21 days ago

it's the easter egg operator. it assigns a random value to your variable. useful for when you need a quick source of good-enough randomness in computer games (/jk)

path: 0 25934200 25935833, hotness: undefined, score: 33, children: 1
Tja 13 points 21 days ago path: 0 25934200 25935833 25940127, hotness: undefined, score: 13, children: 0
FiskFisk33 13 points 21 days ago

question, why is a declaration not a statement?

path: 0 25934014, hotness: undefined, score: 13, children: 6
gratux 38 points 21 days 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.

path: 0 25934014 25934231, hotness: undefined, score: 38, children: 0
sik0fewl 16 points 21 days 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.

path: 0 25934014 25934202, hotness: undefined, score: 16, children: 3
balsoft 9 points 21 days 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!"
path: 0 25934014 25934202 25936239, hotness: undefined, score: 9, children: 0
daychilde 7 points 21 days ago

if an empty statement can be a statement.

Sometimes saying nothing is the loudest statement you can make. ;-)

path: 0 25934014 25934202 25937596, hotness: undefined, score: 7, children: 1
nebeker 4 points 21 days ago

And NOP is a perfectly reasonable instruction.

path: 0 25934014 25934202 25937596 25943967, hotness: undefined, score: 4, children: 0
terranoid 5 points 21 days 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.

path: 0 25934014 25934363, hotness: undefined, score: 5, children: 0
onlinepersona 6 points 21 days ago

wonders of C

path: 0 25935901, hotness: undefined, score: 6, children: 0
spankysalmon 6 points 21 days ago

int x = ...; isn't just a declaration. Both are totally fine in most modern languages.

path: 0 25935357, hotness: undefined, score: 6, children: 1
tias 14 points 21 days ago

in most modern languages.

This post is specifically about C.

path: 0 25935357 25940303, hotness: undefined, score: 14, children: 0
calcopiritus 4 points 20 days ago

Can confirm. I have to do this all the time. Some coworkers just delete it, and I have to explain the situation every time when they see in the git blame that I put that semicolon there.

As someone pointed out in another comment, in switch statements you should just start a new scope with {}. But in actual labels it's just better to put a load-bearing semicolon. You don't need to put it in another line though, I just put them like this:

int main() {
    int *a = malloc(sizeof(*a));
    if (init_a(a) <= 0) {
        goto err;
    }
    do_something(a);
err:;
    int ret = 0;
    if (a == NULL) {
        ret = -1;
    }
    free(a);
    return ret;
}
path: 0 25958161, hotness: undefined, score: 4, children: 0
programmer_humor
programmer_humor

@programming.dev

login for more options
33571
2550
7101

Welcome to Programmer Humor!

This is a place where you can post jokes, memes, humor, etc. related to programming!

For sharing awful code theres also Programming Horror.

Rules

  • Keep content in english
  • No advertisements
  • Posts must be related to programming or programmer topics
    • If the mod doesn't find it funny, you're banned. Ha-ha!... For real: do not use the community for "statements". There are other places for such content. Keep it chill and funny.

go to feed...