有趣的C语言问题 测试你对C语言的熟悉程度

在翻matrix67同学的blog的时候发现一些很有意思的C语言题目,特转过来让大家讨论下

 

1、下面这个程序输出什么?
enum {false,true};
int main()
{
        int i=1;
        do
        {
                printf(“%d/n”,i);
                i++;
                if(i < 15)
                        continue;
        }while(false);
        return 0;
}

2、你相信么?下面这个程序输出的两行东西不一样!
  #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;
  }

3、下面的程序看似完全正确。你能看出它为什么通不过编译吗?
看出问题前不要去试着编译,不然你会后悔你没看出来这个低级的语法错误。
#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;
}

4、为什么下面这个程序的输出不是NONE?看你多久才能看出来。
  #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;
  }

5、下面这个程序输出什么?
#include <stdio.h>
int main()
{
        int i=43;
        printf(“%d/n”,printf(“%d”,printf(“%d”,i)));
        return 0;
}

6、下面这个程序输出什么?
  #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;
  }

7、下面这个程序输出什么?
  #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;
  }

8、下面这个程序输出什么?
  #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;
  }

9、下面这个程序输出什么?
  #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;
  }

10、下面这个程序输出什么?
#include <stdio.h>
int main()
{
        int i=23;
        printf(“%d %d/n”,i++,i++);
        return 0;
}

11、为什么下面这个程序的输出不是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;
  }

12、下面这个程序输出什么?
  #include <stdio.h>
  int main()
  {
      int i = 6;
      if( ((++i < 7) && ( i++/6)) || (++i <= 9))
          ;
      printf(“%d/n”,i);
      return 0;
  }

13、下面这段代码是否合法?
  #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));
  }

14、这是什么意思?有什么潜在的问题?
  #define SWAP(a,b) ((a) ^= (b) ^= (a) ^= (b))

这是什么意思?
  #define ROUNDUP(x,n) ((x+n-1)&(~(n-1)))

一些C语言的教材上会给出一个很经典的宏定义
  #define isupper(c) (((c) >= ‘A’) && ((c) <= ‘Z’))
但这种宏定义的方法存在不足之处,一旦遇到下面这种情况就出问题了:
  char c;
  /* … */
  if(isupper(c++))
  {
      /* … */
  }
为了避免这种问题,应该怎样来定义isupper?

15、怎样用printf函数打印”I can print %”?别忘了百分号是用于格式化输出的。

16、不用任何比较运算符,写一个程序找出三个数中的最小数。

17、不用+号,(用位运算)实现加法运算。

18、最有趣的一个问题:不用分号,写一个Hello World程序。
这是有可能的,而且办法非常简单,只用到了最基本的语法规则。
实在想不出来再看答案吧(白色的):
#include <stdio.h>
int main()
{
    if (printf(“Hello World”)){}
}

查看更多:http://www.gowrikumar.com/c/

原帖地址:http://www.matrix67.com/blog/archives/429

This entry was posted in 程序设计 and tagged . Bookmark the permalink.

10 Responses to 有趣的C语言问题 测试你对C语言的熟悉程度

  1. crazyjixiang says:

    这是C FAQ

    matrix67是IOI大牛

  2. 我晕!程序本不该如此

  3. davelv says:

    <div class="quote"><span class="q"><b>罗响(C/C++学生)</b>: 我晕!程序本不该如此</span></div>就是测试你对语言的熟练程度,大部分是C语言陷阱的例子。实际生产中注意不能写这样的代码

  4. snail says:

    恩,好多都不会

  5. [e01]真不错,谢谢分享

  6. Moon_Night says:

    好吧 我承认我把C都还给老师了~~~

  7. lujie0403 says:

    这个比较NB!

  8. ringer564597 says:

    答案答案。。

  9. davelv says:

    <div class="quote"><span class="q"><b>北京信息科技大学 李成龙(C/C++)</b>: 答案答案。。</span></div>基本上编译出来结果就是答案。

    如果某个特定的题目你想要解释的话,可以把疑问提出来。

回复 snail 取消回复

您的电子邮箱地址不会被公开。 必填项已用*标注