C puzzles详解【21-25题】

第二十一题

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;
  }
题目讲解:
易造成数组越界,scanf改成如下形式比较保险
scanf("%79s",str);
不管输入多少个字节,最多只读取79个字节。

第二十二题

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;
  }
题目讲解:
输出为:
i: 10
sizeof(i++) is:4
i: 10
sizeof(i++),等效于sizeof(int)。sizeof的值在编译时决定,不会执行i++。
sizeof的更多讲解见第一题。

第二十三题

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;
  }
题目讲解
  • 关键字const
用const修饰变量,指定该变量为只读。

const int a = 10;//变量a只读

const int *p;//p指向的int型数只读,p可以被修改

int *const p;//p为只读,p指向的int型数可以被修改
  • 带const的一级指针和二级指针赋值
int a = 10;

const int *p;

p = &a;//一级const指针赋值时,可以不将右边的指针转换为const型
int *p;

const int **pp;

pp = (const int **)&p;//二级const指针赋值时,必须将右侧二级指针转换为const型
  • 带const的一级指针和二级指针传参
void foo(const char *p) {}
int main()
{
char *p;
foo(p);//p不用转化为const型
return 0;
}
void foo(const char **pp) {}
int main()
{
char **pp;
foo((const char **)pp);//pp必须转化为const型
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;
  }
题目讲解:
同第十题。
输出: i:1
逗号运算符在所有的运算符中优先级最低,i = 1,2,3等效于(i = 1),2,3
若将”i = 1,2,3”改成”i = (1,2,3)”,i的值为3。

第二十五题(Reverse Polish Notation)

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;
              /*   ...
               *   ...
               *   ...
               */
          }
      }
  }
题目讲解:(不确定)
减法的减数和被减数反了,除法的除数和被除数反了。
时间: 2024-11-11 23:04:29

C puzzles详解【21-25题】的相关文章

C puzzles详解【51-57题】

第五十一题 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....) 题目讲解: 参考:ht

C puzzles详解【38-45题】

第三十八题 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\

C puzzles详解【46-50题】

第四十六题 What does the following macro do? #define ROUNDUP(x,n) ((x+n-1)&(~(n-1))) 题目讲解: 参考:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=814501 用于内存对齐,n为2的幂. 第四十七题 Most of the C programming books, give the following example for the definitio

C puzzles详解【31-33题】

第三十一题 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(&quo

C puzzles详解【34-37题】

第三十四题 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; }

C puzzles详解【16-20题】

第十六题 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; } 题目讲解: 编译完运行发生段错. File1.

C puzzles详解【26-30题】

第二十六题(不会) 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

C puzzles详解【6-8题】

第六题 #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; } 题目讲解: “defalut”拼写错误. 注意a为int型,case后的’1’,’2’为char型. 第七

C puzzles详解【13-15题】

第十三题 int CountBits(unsigned int x) { int count=0; while(x) { count++; x = x&(x-1); } return count; } 知识点讲解 位运算 关于位运算的一些例子参考: http://www.ugcs.caltech.edu/~wnoise/base2.html 题目讲解 x&(x-1)常见的两种应用: 1)计算x二进制形式中1的个数,每循环一次,将x二进制形式最右边的1变成0: 2)判断x是否是2的幂,若x&