欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
語(yǔ)言的歧義 | 酷殼 - CoolShell.cn


語(yǔ)言是人與人相互溝通的途徑,而計算機語(yǔ)言則是人和計算機溝通的途徑。就算是任何再完美的自然語(yǔ)言都會(huì )有歧義,但是又是什么讓人和計算計算機間產(chǎn)生了歧義呢?
下面這篇文章來(lái)自Gowri Kumar的Puzzle C一文。我做了一些整理,挑選了其中的一些問(wèn)題,并在之后配上相應的答案(這些答案是我加的,如果需要原版的答案可以直接和本文作者Gowri Kumar聯(lián)系,作者的聯(lián)系方式可以從這里得到)。

puzzle 1

此段程序的作者希望輸出數組中的所有元素,但是他卻沒(méi)有得到他想要的結果,是什么讓程序員和計算機產(chǎn)生歧義?

01 #include <stdio.h>
02 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
03 int array[] = {23,34,12,17,204,99,16};
04 int main()
05 {
06     int d;
07   
08     for(d=-1;d <= (TOTAL_ELEMENTS-2);d++)
09         printf("%d\n",array[d+1]);
10   
11     return 0;
12 }

解答:
運行上面的程序,結果是什么都沒(méi)有輸出,導致這個(gè)結果的原因是sizeof的返回值是一個(gè)unsinged int,為此在比較int d 和TOTAL_ELEMENTS兩個(gè)值都被轉換成了unsigned int來(lái)進(jìn)行比較,這樣就導致-1被轉換成一個(gè)非常大的值,以至于for循環(huán)不滿(mǎn)足條件。因此,如果程序員不能理解sizeof操作符返回的是一個(gè)unsigned int的話(huà),就會(huì )產(chǎn)生類(lèi)似如上的人機歧義。

puzzle 2

看上去非常完美的程序,是什么導致了編程程序不通過(guò)?

01 #include <stdio.h>
02   
03 void OS_Solaris_print()
04 {
05     printf("Solaris - Sun Microsystems\n");
06 }
07   
08 void OS_Windows_print()
09 {
10     printf("Windows - Microsoft\n");
11 }
12   
13 void OS_HP-UX_print()
14 {
15     printf("HP-UX - Hewlett Packard\n");
16 }
17   
18 int main()
19 {
20     int num;
21     printf("Enter the number (1-3):\n");
22     scanf("%d",&num);
23   
24     switch(num)
25     {
26         case 1:
27             OS_Solaris_print();
28             break;
29         case 2:
30             OS_Windows_print();
31             break;
32         case 3:
33             OS_HP-UX_print();
34             break;
35         default:
36             printf("Hmm! only 1-3 <IMG class=wp-smiley alt=:-) src="http://coolshell.cn/wp-includes/images/smilies/icon_smile.gif"> \n");
37         break;
38     }
39     return 0;
40 }

解答:
程序員要以計算機的語(yǔ)言進(jìn)行思考,不上上面那段程序導致的結果不止是歧義這么簡(jiǎn)單,而直接的結果是,導致計算機”聽(tīng)不懂”你在說(shuō)什么。導致計算機聽(tīng)不懂的原因是HP-UX中的’-'是減號?還是其他什么?

puzzle 3

下面這段程序會(huì )輸出什么,為什么?

01 enum {false,true};
02   
03 int main()
04 {
05     int i=1;
06     do
07     {
08         printf("%d\n",i);
09         i++;
10   
11         if(i < 15)
12             continue;
13     }while(false);
14   
15     return 0;
16 }

解答:
1到14?不對,結果是1,因為continue的含義是不執行循環(huán)體之后語(yǔ)義,而直接到循環(huán)點(diǎn)。明顯while(false)不屬于循環(huán)體。導致這段程序的歧義就是:程序員沒(méi)有完全理解計算機語(yǔ)言中continue的含義。

puzzle 4

下面這段程序的輸出結果是:

01 #include <stdio.h>
02 #define f(a,b) a##b
03 #define g(a)   #a
04 #define h(a) g(a)
05   
06 int main()
07 {
08         printf("%s\n", h(f(1,2)));
09         printf("%s\n", g(f(1,2)));
10         return 0;
11 }

當然,你首先要了解##和#的用法,如果不懂的話(huà),本題你可以直接跳過(guò)。
解答:
看到這段程序你可能會(huì )認為,這兩個(gè)printf輸出的同一個(gè)結果,可是答案卻非如此,本題的輸出是12和f(1,2),為什么會(huì )這樣呢?因為這是宏,宏的解開(kāi)不象函數執行,由里帶外。

puzzle 5

下面這段程序的輸出是什么

#include <stdio.h>
int main()
{
     int a=10;
     switch(a)
    {
        case ‘1′:
             printf(“ONE\n”);
            break;
        case ‘2′:
            printf(“TWO\n”);
            break;
        defau1t:
             printf(“NONE\n”);
    }
    return 0;
}

解答:
本題我故意將語(yǔ)法敏感插件去掉,為了就是能得到更好的效果,這道題又是什么讓歧義再次發(fā)生,如果不仔細你可能永遠都找不到答案,如果真到的到了那個(gè)時(shí)候,你是否會(huì )因為對default語(yǔ)義的懷疑,而不敢再使用default?本題的歧義點(diǎn)就是default,看好了是defau1t而不是default,不是關(guān)鍵字!為什么計算能”聽(tīng)懂”這樣的defau1t,算然它聽(tīng)懂了,但它的理解卻是標號”defau1t”

puzzle 6

下面這段程序的輸出什么?

01 #include <stdio.h>
02   
03 int main()
04 {
05     float f=0.0f;
06     int i;
07   
08     for(i=0;i<10;i++)
09         f = f + 0.1f;
10   
11     if(f == 1.0f)
12         printf("f is 1.0 \n");
13     else
14         printf("f is NOT 1.0 \n");
15   
16     return 0;
17 }

解答:
你是否似曾相識?不錯這個(gè)問(wèn)題在酷殼之前的博文《你能做對下面這些JavaScript的題嗎?》中曾今提到過(guò),不要讓兩個(gè)浮點(diǎn)數相比較。所以本題的答案是”f is NOT 1.0″,如果你真想比較兩個(gè)浮點(diǎn)數時(shí),你應該按一定精度來(lái)比較,比如你一定要在本題中做比較那么你應該這么做if( (f – 1.0f)<0.1 )

puzzle 7

下面兩個(gè)函數是否具有相同的原型?

1 int foobar(void);
2 int foobar();

下面這兩段程序將會(huì )幫你找到上題的答案
程序1

01 #include <stdio.h>
02 void foobar1(void)
03 {
04     printf("In foobar1\n");
05 }
06   
07 void foobar2()
08 {
09     printf("In foobar2\n");
10 }
11   
12 int main()
13 {
14     char ch = 'a';
15   
16     foobar1();
17     foobar2(33, ch);
18   
19      return 0;
20 }

程序2

01 #include "stdio.h"
02 void foobar1(void)
03 {
04     printf("In foobar1\n");
05 }
06   
07 void foobar2()
08 {
09     printf("In foobar2\n");
10 }
11   
12 int main()
13 {
14     char ch = 'a';
15   
16     foobar1(33,ch);
17     foobar2();
18   
19     return 0;
20 }

解答
程序片段一,沒(méi)有問(wèn)題,程序片段二編譯報錯,這兩個(gè)程序告訴我們,foobar1(void)和foobar2()是有不同原型的的。我們可以在《ISO/IEC 9899》的C語(yǔ)言規范找到下面兩段關(guān)于函數聲明的描述

10.The special case of an unnamed parameter of type void as the only item in the list specifies that the function has no parameters

14.An identifier list declares only the identifiers of the parameters of the function. An empty list in a function declarator that is part of a definition of that function specifies that the function has no parameters. The empty list in a function declarator that is not part of a definition of that function specifies that no information about the number or types of the parameters is supplied.124)

上面兩段話(huà)的意思就是:foobar1(void)是沒(méi)有參數,而foobar1()等于forbar1(…)等于參數類(lèi)型未知。

總結
看到這些C語(yǔ)言的題目,不禁讓我想起了巴別塔,計算機語(yǔ)言作為如此嚴謹的語(yǔ)言都有可能帶來(lái)如此多的歧義,更何況自然語(yǔ)言,更何況相互不通的自然語(yǔ)言。要杜絕歧義,我們就必須清晰的了解計算機語(yǔ)言每一個(gè)指令的語(yǔ)義。就如同人類(lèi),人類(lèi)要和平就要相互了解各自的文化。愿世界上人們清晰了解別人的語(yǔ)言的語(yǔ)義,愿世界不再因為文化的不同而戰爭,原世界和平。
 
 
 

Dear visitor,

Thanks for your interest in C programming. In this page, you will find a list of interesting C programming questions/puzzles, These programs listed are the ones which I have received as e-mail forwards from my friends, a few I read in some books, a few from the internet, and a few from my coding experiences in C.

Most of the programs are meant to be compiled, run and to be explained for their behaviour. The puzzles/questions can be broadly put into the following categories:

  • General typo errors, which C programmers do often and are very difficult to trace.
  • Small programs which are extremely hard to understand at the first examination. These questions make a good excercise of reading and understanding effecient code written by others.

I have used Gnu/Linux/gcc for all of them. The order in which the programs appear doesn't have any relation with the level of difficulty. Please feel free to contact me if you need any help in solving the problems. My contact info. is available here And you might be interested in a few references for C programming, which I personally found very interesting.

If you are preparing for campus interviews, you might find the following link interesting:
http://placementsindia.blogspot.com
http://www.interviewmantra.net/category/interview-questions/c


Regards,
Gowri Kumar

C puzzles


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


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;}
hint

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;            }            
hint

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?
hint

  #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;
}
If 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");elseprintf("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);
}
}
Is 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;
}

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;
}

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;
}

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.cbash$ ./a.outa = 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)))

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.
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.
What does the format specifier %n of printf function do?
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!!!)
What's the difference between the following two C statements?
  const char *p;
char* const p;

What is the difference between memcpy and memmove?
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.
Write a C program which prints Hello World! without using a semicolon!!!
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
高級語(yǔ)言程序設計A第4次作業(yè)
【C語(yǔ)言】12個(gè)有趣的C語(yǔ)言問(wèn)答
12個(gè)有趣的C語(yǔ)言面試題
野指針與非法內存操作
char *a 和char a[] 的區別(指針和數組的區別)
Linux網(wǎng)絡(luò )編程多字節數據的收發(fā)(上)
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久