Bennu Game Development

English Forums => Offtopic => Topic started by: panreyes on March 06, 2013, 02:33:38 PM

Title: Deep C
Post by: panreyes on March 06, 2013, 02:33:38 PM

I've just learnt something :|http://www.pvv.org/~oma/DeepC_Scandev_Mar2013.pdf


It made me understand of all those bugs in my C practices.
Title: Re:Deep C
Post by: handsource-dyko on March 06, 2013, 03:00:29 PM
He, that's a pretty interessting book. I knww C is a dangerous language, this book explains things clearly in a funny way.  No I understand why so many C programs are cryptic.... ;D
Title: Re:Deep C
Post by: SplinterGU on March 06, 2013, 03:32:40 PM
I can explain you lot of this behavoir, but not in english... if you want  I can do it in spanish...

for example, is stupid said, that C reuse a var between several functions, only is the space for non-static vars...

this give you 42, too.

#include <stdio.h>
void foo(void)
{
        int a;
        printf("%d\n", a);
}
void bar(void)
{
        int b = 42;
}
int main(void)
{
        bar();
        foo();
}


the first example, is curious, but is logic... depend on stack state machine based implementation or direct interpreter...

well, who did this document?
Title: Re:Deep C
Post by: SplinterGU on March 06, 2013, 03:45:57 PM
I don't understand why the document said that examples, like this fail... in my linux gcc they works right


#include <stdio.h>
int main(void) {
int v[6] = {4,6,2,9};
int i = 2;
int j = i * 3 + v[i++];
printf("%d\n", j);
}


this give 8... is ok



#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
int main()
{
        // implementation-defined
         int i = ~0;
         i >>= 1;
         printf("%d\n", i);
         // unspecified
         printf("4") + printf("2");
         printf("\n");
         // undefined
         int k = INT_MAX;
         k += 1;
         printf("%d\n", k);
         }


this give us...

-1
42
-2147483648

values are ok.

-1 is because you use int (then rotation is signed rotation)... if you define "i" as unsigned int, the values are differents.
Title: Re:Deep C
Post by: panreyes on March 06, 2013, 03:57:31 PM
If you read it thoroughly it says it may work with some compilers, but you should be aware of that possible problem for troubleshooting.


Quote
int j = i * 3 + v[i++];[/size]



Because of some compiler optimizations, it's not recommended to read and change the same variable in the same expression or sentence.
Title: Re:Deep C
Post by: SplinterGU on March 06, 2013, 04:03:16 PM
optimization bug of specific compiler... in gcc works fine...

and is recommended initialize vars on declaration or before his use.