3 ms·
They can be useful when adding things to an array in a loop. A trivial example which removes a character from a null terminated string: void remove_char(char
by trealira 2y ago
They can be useful when adding things to an array in a loop. A trivial example which removes a character from a null terminated string:
void remove_char(char *s, char c) {
size_t i, j;
for (i = j = 0; s[i] != '\0'; i++)
if (s[i] != c)
s[j++] = c;
s[j] = '\0';
}
This might be better expressed with a higher order filter function, but C is too low level for things like that.
There are also idioms for stack manipulation using them: "stack[sp++] = pushed" and "popped = stack[--sp]".
C code does a lot of incrementing and decrementing by one, and so having dedicated syntax for it is convenient.
- jancsika 2y agoNote that in your example there appear to be three distinct meanings: 1. prefix incr/decr precedence: "stack[--sp]" 2. postfix incr/decr precedence: "s[j++]" 3. i have no particular preference for the precedence and am just using a shorthand I inherited from my ancestors whose use cases are no longer relevant to me: "i++" in your for loop My rank speculation is that C programmers get in a habit of #3 and then forget to consider precedence in an expression where it matters. In any case, it would be interesting to do a scan of github to see how often prefix and suffix incr/decr had to get switched up in a bugfix patch.
- trealira 2y agoSilly mistake: that should read "s[j++] = s[i]".