load all comments
mfz 13 points 3 years ago

Isn't the evaluated value different from the expression? i++ returns the value of i before increasing. i-=-1 would return the value after it has been increased. Wouldn't it be more correct to make it equal to ++i

path: 0 345799, hotness: undefined, score: 13, children: 11
maiskanzler 13 points 3 years ago

And that's why post- and pre-increment is non-existant in Python and Rust. It's an easy source for bugs for a noncritical abbreviation🀷

path: 0 345799 353274, hotness: undefined, score: 13, children: 2
Knusper 2 points 3 years ago

They're especially also a source of bugs, because they encourage manually incrementing indices and manually accessing array positions, which is almost never actually sensible.

path: 0 345799 353274 355242, hotness: undefined, score: 2, children: 1
mfz 8 points 3 years ago

If you're hell bend on achieving the goodness of i++ equivalent you could wrap it up like this:
(i-=-1,i-1)

We're talking C here of course.

path: 0 345799 353831, hotness: undefined, score: 8, children: 0
Knusper 6 points 3 years ago

In the languages I know, i-=-1 or x=3 are not expressions, but rather statements, so they do not evaluate to a value.

So, this would be a compiler error:

a = (x=3)
path: 0 345799 355002, hotness: undefined, score: 6, children: 2
mfz 10 points 3 years ago

Well, not all languages allow for fun programming :)

path: 0 345799 355002 355209, hotness: undefined, score: 10, children: 1
Barzaria 5 points 3 years ago

Please explain in less detail to help me understand, internet friend.

path: 0 345799 354780, hotness: undefined, score: 5, children: 1
mfz 5 points 3 years ago

In C you can group expressions within ( and ) separated with ,. Expressions are evaluated in order and the last expression in the group is the returned value of the group.

path: 0 345799 354780 355175, hotness: undefined, score: 5, children: 0
Jamie 2 points 3 years ago

I gave it a shot in Compiler Explorer, with the following code:

#include <stdio.h>

int main() {
  for (int i = 0; i < 10; i -= -1) {
    printf("%d", i);
  }
}

GCC takes the i-=-1 and optimizes it into ADD DWARD PTR [rbp-4], 1, and changing it around to ++i or i++ makes no difference.

So, at least in C and C++, it works all the same. Even on unsigned integers.

path: 0 345799 372242, hotness: undefined, score: 2, children: 1
mfz 5 points 3 years ago

It works the same because the value of the last expression in the for loop is not used for anything. It's the side effect of that statement that counts. Eg, the value of i is checked the next time the for loop is executed by the condition check. Try replacing i in the condition check instead with i++ or ++i and you would see different results.

Something like: for (int i = 0; ++i < 10;) { ... }

path: 0 345799 372242 374921, hotness: undefined, score: 5, children: 0
programmer_humor
programmer_humor

@programming.dev

login for more options
33653
2567
7610

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...