What general tips do you have for golfing(tips and tricks) in C?
1. Use bitwise XOR or - minus sign to check for inequality between integers:
if(a^b)
instead ofif(a!=b)
save 1 character.if(a-b)
instead ofif(a!=b)
also save 1 character.
2. Abuse main's
argument list to declare one or more integer variables:
main(a)
{
for(;++a<28;)
putchar(95+a);
}
3. The comma operator can be used to execute multiple expressions in a single block while avoiding braces:
main()
{
int i = 0;
int j = 1;
if(1)
{
i=j,j+=1,printf("%d %d\n",i,j); // multiple statements are all executed
}
else
{
printf("failed\n");
}
}
4. The ternary conditional operator ?:
can often be used as a stand in for simple if-else
statements at considerable savings:
main()
{
int a = 10, b = 20;
//using if else
if (a > b)
{
printf("%d is bigger.",a);
}
else
{
printf("%d is bigger.",b);
}
//using ternary conditional operator
printf("%d is bigger",(a>b)?a:b);
}
5. #define macros whose expansion has unbalanced braces/parentheses:
#define P printf(
main()
{
P"Hello World");
}
6. Use *a instead of a[0] for accessing the first element of an array.
7. Combine assignment with function calls:
Instead of this:
r = 123;
printf("%d", r);
Do this:
printf("%d", r = 123);
8. Initialize multiple variables together:
Instead of this:
for(i=0,j=0;...;...)
{
/* ... */
}
Do this:
for(i=j=0;...;...)
{
/* ... */
}
9. Collapse zero/nonzero values
When you have an integer value and you need to collapse it to either 1 or 0, you can use !! to do so easily. This is sometimes advantageous for other alternatives like ?:.
Take this situation:
n=2*n+isupper(s[j])?1:0; /* 24 */
You could instead do this:
n=n*2+!!isupper(s[j]); /* 22 */
Another example:
r=R+(memcmp(b+6,"---",3)?R:0); /* 30 */
Could be rewritten as:
r=R+R*!!memcmp(b+6,"---",3)); /* 29 */
10. Avoid catastrophic function-argument type declarations
If you're declaring a function where all five arguments are ints, then life is good. you can simply write
f(a,b,c,d,e){
But suppose d
needs to be a char
, or even an int*
. Then you're screwed! If one parameter is preceded by a type, all of them must be:
f(int a,int b,int c,int*d,int e){
But wait! There is a way around this disastrous explosion of useless characters. It goes like this:
f(a,b,c,d,e) int *d; {
This even saves on a standard main declaration if you need to use the command-line arguments:
main(c,v)char**v;{
is two bytes shorter than
main(int c,char**v){
You can submit your own in comment section.