看到了这个网址http://www.gowrikumar.com/c/,作者收集了一系列网上和自己所遇到的C语言有趣的东西,我感觉挺像<Java解惑>的风格,我下面就尝试解决一下作者提出的问题.
第一题
- The expected output of the following C program is to print the elements in the array. But when actually run, it doesn't do so.
- #include<stdio.h>
- #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
- int array[] = {23,34,12,17,204,99,16};
- int main()
- {
- int d;
- for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
- printf("%d\n",array[d+1]);
- return 0;
- }
- Find out what's going wrong.
第二题:
- I thought the following program was a perfect C program. But on compiling, I found a silly mistake. Can you find it out (without compiling the program :-) ?
- #include<stdio.h>
- void OS_Solaris_print()
- {
- printf("Solaris - Sun Microsystems\n");
- }
- void OS_Windows_print()
- {
- printf("Windows - Microsoft\n");
- }
- void OS_HP-UX_print()
- {
- printf("HP-UX - Hewlett Packard\n");
- }
- int main()
- {
- int num;
- printf("Enter the number (1-3):\n");
- scanf("%d",&num);
- switch(num)
- {
- case 1:
- OS_Solaris_print();
- break;
- case 2:
- OS_Windows_print();
- break;
- case 3:
- OS_HP-UX_print();
- break;
- default:
- printf("Hmm! only 1-3 :-)\n");
- break;
- }
- return 0;
- }
第三道题:
- What's the expected output for the following program and why?
- enum {false,true};
- int main()
- {
- int i=1;
- do
- {
- printf("%d\n",i);
- i++;
- if(i < 15)
- continue;
- }while(false);
- return 0;
- }
第四道题:
- The following program doesn't "seem" to print "hello-out". (Try executing it)
- #include <stdio.h>
- #include <unistd.h>
- int main()
- {
- while(1)
- {
- fprintf(stdout,"hello-out");
- fprintf(stderr,"hello-err");
- sleep(1);
- }
- return 0;
- }
- What could be the reason?
第五道题:
- #include <stdio.h>
- #define f(a,b) a##b
- #define g(a) #a
- #define h(a) g(a)
- int main()
- {
- printf("%s\n",h(f(1,2)));
- printf("%s\n",g(f(1,2)));
- return 0;
- }
- Just by looking at the program one "might" expect the output to be, the same for both the printf statements. But on running the program you get it as:
- bash$ ./a.out
- 12
- f(1,2)
- bash$
- Why is it so?
第六道题:
- #include<stdio.h>
- int main()
- {
- int a=10;
- switch(a)
- {
- case '1':
- printf("ONE\n");
- break;
- case '2':
- printf("TWO\n");
- break;
- defa1ut:
- printf("NONE\n");
- }
- return 0;
- }
- you expect the output of the above program to be NONE, I would request you to check it out!!
第七道题:
- The following C program segfaults of IA-64, but works fine on IA-32.
- int main()
- {
- int* p;
- p = (int*)malloc(sizeof(int));
- *p = 10;
- return 0;
- }
- Why does it happen so?
第八道题:
- Here is a small piece of program(again just 14 lines of program) which counts the number of bits set in a number.
- Input Output
- 0 0(0000000)
- 5 2(0000101)
- 7 3(0000111)
- int CountBits (unsigned int x )
- {
- static unsigned int mask[] = { 0x55555555,
- 0x33333333,
- 0x0F0F0F0F,
- 0x00FF00FF,
- 0x0000FFFF
- } ;
- int i ;
- int shift ; /* Number of positions to shift to right*/
- for ( i =0, shift =1; i < 5; i ++, shift *= 2)
- x = (x & mask[i ])+ ( ( x >> shift) & mask[i]);
- return x;
- }
- Find out the logic used in the above program.
第九道题:
- What do you think would be the output of the following program and why? (If you are about to say "f is 1.0", I would say check it out again)
- #include <stdio.h>
- int main()
- {
- float f=0.0f;
- int i;
- for(i=0;i<10;i++)
- f = f + 0.1f;
- if(f == 1.0f)
- printf("f is 1.0 \n");
- else
- printf("f is NOT 1.0\n");
- return 0;
- }
第十道题:
- I thought the following C program is perfectly valid (after reading about the comma operator in C). But there is a mistake in the following program, can you identify it?
- #include <stdio.h>
- int main()
- {
- int a = 1,2;
- printf("a : %d\n",a);
- return 0;
- }
第十一道题:
- What would be the output of the following C program? (Is it a valid C program?)
- #include <stdio.h>
- int main()
- {
- int i=43;
- printf("%d\n",printf("%d",printf("%d",i)));
- return 0;
- }
第十二道题:
- void duff(register char *to, register char *from, register int count)
- {
- register int n=(count+7)/8;
- switch(count%8){
- case 0: do{ *to++ = *from++;
- case 7: *to++ = *from++;
- case 6: *to++ = *from++;
- case 5: *to++ = *from++;
- case 4: *to++ = *from++;
- case 3: *to++ = *from++;
- case 2: *to++ = *from++;
- case 1: *to++ = *from++;
- }while( --n >0);
- }
- }
- s the above valid C code? If so, what is it trying to acheive and why would anyone do something like the above?
第十三道题:
- Here is yet another implementation of CountBits. Verify whether it is correct (how do you that???). If so, find out the logic used.
- int CountBits(unsigned int x)
- {
- int count=0;
- while(x)
- {
- count++;
- x = x&(x-1);
- }
- return count;
- }
第十四道题:
- Are the following two function prototypes same?
- int foobar(void);
- int foobar();
- The following programs should be of some help in finding the answer: (Compile and run both the programs and see what happens)
- Program 1:
- #include <stdio.h>
- void foobar1(void)
- {
- printf("In foobar1\n");
- }
- void foobar2()
- {
- printf("In foobar2\n");
- }
- int main()
- {
- char ch = 'a';
- foobar1();
- foobar2(33, ch);
- return 0;
- }
- Program 2:
- #include <stdio.h>
- void foobar1(void)
- {
- printf("In foobar1\n");
- }
- void foobar2()
- {
- printf("In foobar2\n");
- }
- int main()
- {
- char ch = 'a';
- foobar1(33, ch);
- foobar2();
- return 0;
- }
第十五道题:
- What's the output of the following program and why?
- #include <stdio.h>
- int main()
- {
- float a = 12.5;
- printf("%d\n", a);
- printf("%d\n", *(int *)&a);
- return 0;
- }
第十六道题:
- The following is a small C program split across files. What do you expect the output to be, when both of them compiled together and run?
- File1.c
- int arr[80];
- File2.c
- extern int *arr;
- int main()
- {
- arr[1] = 100;
- return 0;
- }
第十七道:
- Explain the output of the following C program (No, the output is not 20).
- #include<stdio.h>
- int main()
- {
- int a=1;
- switch(a)
- { int b=20;
- case 1: printf("b is %d\n",b);
- break;
- default:printf("b is %d\n",b);
- break;
- }
- return 0;
- }
第十八道:
- What is the output of the following program? (Again, it is not 40, (if the size of integer is 4)).
- #define SIZE 10
- void size(int arr[SIZE])
- {
- printf("size of array is:%d\n",sizeof(arr));
- }
- int main()
- {
- int arr[SIZE];
- size(arr);
- return 0;
- }
第十九道:
- The following is a simple c program, in which there is a function called Error to display errors. Can you see a potential problem with the way Error is defined?
- #include <stdlib.h>
- #include <stdio.h>
- void Error(char* s)
- {
- printf(s);
- return;
- }
- int main()
- {
- int *p;
- p = malloc(sizeof(int));
- if(p == NULL)
- {
- Error("Could not allocate the memory\n");
- Error("Quitting....\n");
- exit(1);
- }
- else
- {
- /*some stuff to use p*/
- }
- return 0;
- }
第二十道题:
- What is the differnce between the following function calls to scanf?(Please notice the space carefully in the second call. Try removing it and observe the behaviour of the program)
- #include <stdio.h>
- int main()
- {
- char c;
- scanf("%c",&c);
- printf("%c\n",c);
- scanf(" %c",&c);
- printf("%c\n",c);
- return 0;
- }
第二十一道:
- What is the potential problem with the following C program?
- #include <stdio.h>
- int main()
- {
- char str[80];
- printf("Enter the string:");
- scanf("%s",str);
- printf("You entered:%s\n",str);
- return 0;
- }
字符串结尾问题,如果输入的过长,超过了80个字符,则str字符数组最后一个元素就不是\0,printf函数在打印时则会造成程序的越界访问甚至会崩溃.
第二十二道:
- What is the output of the following program?
- #include <stdio.h>
- int main()
- {
- int i;
- i = 10;
- printf("i : %d\n",i);
- printf("sizeof(i++) is: %d\n",sizeof(i++));
- printf("i : %d\n",i);
- return 0;
- }
第二十三道:
- Why does the following program give a warning? (Please remember that sending a normal pointer to a function requiring const pointer does not give any warning)
- #include <stdio.h>
- void foo(const char **p) { }
- int main(int argc, char **argv)
- {
- foo(argv);
- return 0;
- }
第二十四道:
- What is the output of the following program?
- #include <stdio.h>
- int main()
- {
- int i;
- i = 1,2,3;
- printf("i:%d\n",i);
- return 0;
- }
第二十五道:
- The following is a piece of code which implements the reverse Polish Calculator. There is a(are) serious(s) bug in the code. Find it(them) out!!! Assume that the function getop returns the appropriate return values for operands, opcodes, EOF etc..
- #include <stdio.h>
- #include <stdlib.h>
- #define MAX 80
- #define NUMBER '0'
- int getop(char[]);
- void push(double);
- double pop(void);
- int main()
- {
- int type;
- char s[MAX];
- while((type = getop(s)) != EOF)
- {
- switch(type)
- {
- case NUMBER:
- push(atof(s));
- break;
- case '+':
- push(pop() + pop());
- break;
- case '*':
- push(pop() * pop());
- break;
- case '-':
- push(pop() - pop());
- break;
- case '/':
- push(pop() / pop());
- break;
- /* ...
- * ...
- * ...
- */
- }
- }
- }
第二十六道:
- The following is a simple program which implements a minimal version of banner command available on most *nix systems. Find out the logic used in the program.
- #include<stdio.h>
- #include<ctype.h>
- char t[]={
- 0,0,0,0,0,0,12,18,33,63,
- 33,33,62,32,62,33,33,62,30,33,
- 32,32,33,30,62,33,33,33,33,62,
- 63,32,62,32,32,63,63,32,62,32,
- 32,32,30,33,32,39,33,30,33,33,
- 63,33,33,33,4,4,4,4,4,4,
- 1,1,1,1,33,30,33,34,60,36,
- 34,33,32,32,32,32,32,63,33,51,
- 45,33,33,33,33,49,41,37,35,33,
- 30,33,33,33,33,30,62,33,33,62,
- 32,32,30,33,33,37,34,29,62,33,
- 33,62,34,33,30,32,30,1,33,30,
- 31,4,4,4,4,4,33,33,33,33,
- 33,30,33,33,33,33,18,12,33,33,
- 33,45,51,33,33,18,12,12,18,33,
- 17,10,4,4,4,4,63,2,4,8,
- 16,63
- };
- int main(int argc,char** argv)
- {
- int r,pr;
- for(r=0;r<6;++r)
- {
- char *p=argv[1];
- while(pr&&*p)
- {
- int o=(toupper(*p++)-'A')*6+6+r;
- o=(o<0||o>=sizeof(t))?0:o;
- for(pr=5;pr>=-1;--pr)
- {
- printf("%c",( ( (pr>=0) && (t[o]&(1<<pr)))?'#':' '));
- }
- }
- printf("\n");
- }
- return 0;
- }
第二十七道:
- What is the output of the following program?
- #include <stdio.h>
- #include <stdlib.h>
- #define SIZEOF(arr) (sizeof(arr)/sizeof(arr[0]))
- #define PrintInt(expr) printf("%s:%d\n",#expr,(expr))
- int main()
- {
- /* The powers of 10 */
- int pot[] = {
- 0001,
- 0010,
- 0100,
- 1000
- };
- int i;
- for(i=0;i<SIZEOF(pot);i++)
- PrintInt(pot[i]);
- return 0;
- }
第二十八道:
- The following is the implementation of the Euclid's algorithm for finding the G.C.D(Greatest Common divisor) of two integers. Explain the logic for the below implementation and think of any possible improvements on the current implementation.
- BTW, what does scanf function return?
- #include <stdio.h>
- int gcd(int u,int v)
- {
- int t;
- while(v > 0)
- {
- if(u > v)
- {
- t = u;
- u = v;
- v = t;
- }
- v = v-u;
- }
- return u;
- }
- int main()
- {
- int x,y;
- printf("Enter x y to find their gcd:");
- while(scanf("%d%d",&x, &y) != EOF)
- {
- if(x >0 && y>0)
- printf("%d %d %d\n",x,y,gcd(x,y));
- printf("Enter x y to find their gcd:");
- }
- printf("\n");
- return 0;
- }
- Also implement a C function similar to the above to find the GCD of 4 integers.
第二十九道:
- What's the output of the following program. (No, it's not 10!!!)
- #include <stdio.h>
- #define PrintInt(expr) printf("%s : %d\n",#expr,(expr))
- int main()
- {
- int y = 100;
- int *p;
- p = malloc(sizeof(int));
- *p = 10;
- y = y/*p; /*dividing y by *p */;
- PrintInt(y);
- return 0;
- }
第三十道:
- The following is a simple C program to read a date and print the date. Run it and explain the behaviour
- #include <stdio.h>
- int main()
- {
- int day,month,year;
- printf("Enter the date (dd-mm-yyyy) format including -'s:");
- scanf("%d-%d-%d",&day,&month,&year);
- printf("The date you have entered is %d-%d-%d\n",day,month,year);
- return 0;
- }
第三十一道:
- The following is a simple C program to read and print an integer. But it is not working properly. What is(are) the mistake(s)?
- #include <stdio.h>
- int main()
- {
- int n;
- printf("Enter a number:\n");
- scanf("%d\n",n);
- printf("You entered %d \n",n);
- return 0;
- }
首先scanf中n是不对的,应该传入&n,此外scanf("%d\n",n)中的\n也是问题,scanf中尽量不要使用非输入控制符,像上面的程序就需要输入两个数字程序才能运行完毕.此外,这个程序估计还有别的我不知道的问题.
第三十二道:
- The following is a simple C program which tries to multiply an integer by 5 using the bitwise operations. But it doesn't do so. Explain the reason for the wrong behaviour of the program.
- #include <stdio.h>
- #define PrintInt(expr) printf("%s : %d\n",#expr,(expr))
- int FiveTimes(int a)
- {
- int t;
- t = a<<2 + a;
- return t;
- }
- int main()
- {
- int a = 1, b = 2,c = 3;
- PrintInt(FiveTimes(a));
- PrintInt(FiveTimes(b));
- PrintInt(FiveTimes(c));
- return 0;
- }
第三十三道:
- Is the following a valid C program?
- #include <stdio.h>
- #define PrintInt(expr) printf("%s : %d\n",#expr,(expr))
- int max(int x, int y)
- {
- (x > y) ? return x : return y;
- }
- int main()
- {
- int a = 10, b = 20;
- PrintInt(a);
- PrintInt(b);
- PrintInt(max(a,b));
- }
第三十四道:
- The following is a piece of C code, whose intention was to print a minus sign 20 times. But you can notice that, it doesn't work.
- #include <stdio.h>
- int main()
- {
- int i;
- int n = 20;
- for( i = 0; i < n; i-- )
- printf("-");
- return 0;
- }
- Well fixing the above code is straight-forward. To make the problem interesting, you have to fix the above code, by changing exactly one character. There are three known solutions. See if you can get all those three.
第三十五道:
- What's the mistake in the following code?
- #include <stdio.h>
- int main()
- {
- int* ptr1,ptr2;
- ptr1 = malloc(sizeof(int));
- ptr2 = ptr1;
- *ptr2 = 10;
- return 0;
- }
第三十六道:
- What is the output of the following program?
- #include <stdio.h>
- int main()
- {
- int cnt = 5, a;
- do {
- a /= cnt;
- } while (cnt --);
- printf ("%d\n", a);
- return 0;
- }
当cnt为1时while(cnt--)为真,所以继续进行循环,而此时cnt经过自减操作cnt为0,所以a /= cnt成了a /= 0,会发生除零错误
第三十七道题:
- What is the output of the following program?
- #include <stdio.h>
- int main()
- {
- int i = 6;
- if( ((++i < 7) && ( i++/6)) || (++i <= 9))
- ;
- printf("%d\n",i);
- return 0;
- }
第三十八道题:
- What is the bug in the following program?
- #include <stdlib.h>
- #include <stdio.h>
- #define SIZE 15
- int main()
- {
- int *a, i;
- a = malloc(SIZE*sizeof(int));
- for (i=0; i<SIZE; i++)
- *(a + i) = i * i;
- for (i=0; i<SIZE; i++)
- printf("%d\n", *a++);
- free(a);
- return 0;
- }
第三十九道题:
- Is the following a valid C program? If so, what is the output of it?
- #include <stdio.h>
- int main()
- {
- int a=3, b = 5;
- printf(&a["Ya!Hello! how is this? %s\n"], &b["junk/super"]);
- printf(&a["WHAT%c%c%c %c%c %c !\n"], 1["this"],
- 2["beauty"],0["tool"],0["is"],3["sensitive"],4["CCCCCC"]);
- return 0;
- }
第四十道题:
- What is the output of the following, if the input provided is:
- Life is beautiful
- #include <stdio.h>
- int main()
- {
- char dummy[80];
- printf("Enter a string:\n");
- scanf("%[^a]",dummy);
- printf("%s\n",dummy);
- return 0;
- }
第四十一道题:
- Note : This question has more to do with Linker than C language
- We have three files a.c, b.c and main.c respectively as follows:
- a.c
- ---
- int a;
- b.c
- ---
- int a = 10;
- main.c
- ------
- extern int a;
- int main()
- {
- printf("a = %d\n",a);
- return 0;
- }
- Let's see what happens, when the files are compiled together:
- bash$ gcc a.c b.c main.c
- bash$ ./a.out
- a = 10
- Hmm!! no compilation/linker error!!! Why is it so??
第四十二道题:
- The following is the offset macros which is used many a times. Figure out what is it trying to do and what is the advantage of using it.
- #define offsetof(a,b) ((int)(&(((a*)(0))->b)))
这是stddef.h里定义的一个宏,其返回值为size_t,它适用于结构和union,用于检索结构成员相对于父结构的偏移量,第一个参数为结构名称,第二个参数为结构中的字段名,其主要实现如下:将地址0强制转换为对应结构指针,此时结构的地址为0,然后使用->获得b的内容,再使用&操作符获得b的地址,再将b的地址转换为int类型,使用b的地址减去结构地址0(因为是0强转的),即为结构字段b相对于结构的偏移量,这种在嵌入式里面用的比较多,这里有一篇详解它的文章.它的使用例子如下:
- #include <stdio.h>
- #include <stddef.h>
- void main(void)
- {
- struct test
- {
- int a;
- short b;
- char c;
- int d;
- };
- struct test a;
- size_t offset = offsetof(struct test,c);
- printf("the offset of c is %d\n",offset); /* 输出6,因为32位机器上int占4字节,short为2字节 */
- }
第四十三道题:
- The following is the macro implementation of the famous, Triple xor swap.
- #define SWAP(a,b) ((a) ^= (b) ^= (a) ^= (b))
- What are the potential problems with the above macro?
第四十四道题:
- What is the use of the following macro?
- #define DPRINTF(x) printf("%s:%d\n",#x,x)
第四十五道题:
- Let's say you were asked to code a function IAddOverFlow which takes three parameters, pointer to an integer where the result is to be stored, and the two integers which needs to be added. It returns 0 if there is an overflow and 1 otherwise:
- int IAddOverFlow(int* result,int a,int b)
- {
- /* ... */
- }
- So, how do you code the above function? (To put in a nutshell, what is the logic you use for overflow detection?)
第四十六道题:
- What does the following macro do?
- #define ROUNDUP(x,n) ((x+n-1)&(~(n-1)))
第四十七道题:
- Most of the C programming books, give the following example for the definition of macros.
- #define isupper(c) (((c) >= 'A') && ((c) <= 'Z'))
- But there would be a serious problem with the above definition of macro, if it is used as follows (what is the problem??)
- char c;
- /* ... */
- if(isupper(c++))
- {
- /* ... */
- }
- But most of the libraries implement the isupper (declared in ctypes.h) as a macro (without any side effects). Find out how isupper() is implemented on your system.
如果调用issuper(c++),那么实际上c++在宏中调用了两次,比如c = 'Y',调用issuper(c++)完后Y就变成了字符[,与作者本意不同,因为作者本意是c++运算后,此时运算为字符'Z',一般机器上的都是用位运算来做的,因为大小写字母刚好差32,换算成十六进制就是0x20,即大小写字母只是在第六位(从右到左数)比特位上不相同,其他比特字节相同,所以用位运算又快又准确.
第四十八道题:
- I hope you know that ellipsis (...) is used to specify variable number of arguments to a function. (What is the function prototype declaration for printf?) What is wrong with the following delcaration?
- int VarArguments(...)
- {
- /*....*/
- return 0;
- }
第四十九道题:
- Write a C program to find the smallest of three integers, without using any of the comparision operators.
我的思路,使用位运算
- #include <stdio.h>
- /**
- * 找到两个数中的较小的数,如果相等返回同一个数
- * 这种方法只适用于使用补码表示有符号数的计算机,且是8比特补码系统
- */
- int findLess(int a,int b)
- {
- int c = a - b;
- int flag = c >> (sizeof(int) * 8 - 1); /* 获取标志位 */
- if(flag) /* 标志位为1表示结果为负数 */
- {
- return a;
- }
- else if(c) /* 此时标志位为0,表示c为非负数,如果c为真,表示c大于0,返回b */
- {
- return b;
- }
- else /* c为0,表示两个数相等 */
- {
- return a;
- }
- printf("compare error\n");
- return -1;
- }
- void main(void)
- {
- int a = 1,b = 2,c = 2;
- printf("the small integer is %d\n",findLess(a,findLess(b,c)));
- }
第五十道题:
- What does the format specifier %n of printf function do?
msdn描述如下,%n表示当前已经成功写入流或者缓冲的字符数目;该值保存在一个整数中,其地址作为参数传给printf函数,且说明%n内在并不安全,所以默认情况下是禁用的,要使用%n,请查看_set_printf_count_output等.例子如下:
- #include <stdio.h>
- /**
- * gcc编译
- */
- void main(void)
- {
- char* str = "hello world";
- int n;
- printf("%s\n%n",str,&n); /* 传入n的地址 */
- printf("%d\n",n); /* 打印n的值 */
- }
第五十一道题:
- Write a C function which does the addition of two integers without using the '+' operator. You can use only the bitwise operators.(Remember the good old method of implementing the full-adder circuit using the or, and, xor gates....)
第五十二道题:
- How do you print I can print % using the printf function? (Remember % is used as a format specifier!!!)
- #include <stdio.h>
- void main(void)
- {
- printf("I can print %% use the printf function\n");
- }
第五十三道题:
- What's the difference between the following two C statements?
- const char *p;
- char* const p;
- #include <stdio.h>
- int main()
- {
- const char a = 'a';
- const char b = 'b';
- char c = 'c';
- const char *p;
- p = &a;
- printf("%c\n",*p); /* 输出a */
- p = &b;
- printf("%c\n",*p); /* 输出b */
- p = &c;
- printf("%c\n",*p); /* 输出c */
- /*
- *p = 'd'; 这句需要注释掉,否则会报错error: assignment of read-only location '*p'
- */
- return 0;
- }
- #include <stdio.h>
- int main()
- {
- const char a = 'a';
- char b = 'b';
- char c = 'c';
- /*
- 这句注释掉,否则会报warning: initialization discards 'const' qualifier from pointer target type [enabled by default]
- 这也说明不要将常量的地址赋值给char* const 类型的指针
- char* const p = &a;
- */
- char* const p = &b; /* 定义时即赋值 */
- printf("%c\n",*p);
- *p = c; /* 可以使用p修改p所指向的数据 */
- printf("%c\n",b);
- printf("%c\n",c);
- /*
- p = &c; 这句需要注释掉,否则报错error: assignment of read-only location '*p'
- */
- }
第五十四道题:
- What is the difference between memcpy and memmove?
如果传入的原地址与目标地址有重叠的话,memmove总能正确处理,memcpy则不一定可行.
第五十五道题:
- What is the format specifiers for printf to print double and float values?
第五十六道题:
- Write a small C program to determine whether a machine's type is little-endian or big-endian.
- 方法一:
- #include <stdio.h>
- int main(void)
- {
- int a = 1;
- char *p = (char*) &a;
- if(*p == 1)
- {
- printf("the machine is little endian\n");
- }
- else
- {
- printf("the machine is big endian\n");
- }
- return 0;
- }
- 方法二:
- #include <stdio.h>
- typedef union endian_
- {
- int a;
- char b;
- } Endian;
- int main(void)
- {
- Endian a;
- a.a = 1;
- if(a.b == 1)
- {
- printf("the machine is little endian\n");
- }
- else
- {
- printf("the machine is big endian\n");
- }
- return 0;
- }
- Write a C program which prints Hello World! without using a semicolon!!!
stackOverflow给输了多种答案,下面是其中的一种
- #include <stdio.h>
- void main(void)
- {
- if(printf("hello world\n")){}
- }