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

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

你相信么?下面这个程序输出的两行东西不一样!
  #include <stdio.h>
  #define f(a,b) a##b
  #define g(a)   #a
  #define h(a) g(a)

  int main()
  {
          printf("%sn",h(f(1,2)));
          printf("%sn",g(f(1,2)));
          return 0;
  }

下面的程序看似完全正确。你能看出它为什么通不过编译吗?
看出问题前不要去试着编译,不然你会后悔你没看出来这个低级的语法错误。
#include<stdio.h>

void OS_Solaris_print()
{
        printf("Solaris - Sun Microsystemsn");
}

void OS_Windows_print()
{
        printf("Windows - Microsoftn");

}
void OS_HP-UX_print()
{
        printf("HP-UX - Hewlett Packardn");
}

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

为什么下面这个程序的输出不是NONE?看你多久才能看出来。
  #include<stdio.h>
  int main()
  {
          int a=10;
          switch(a)
          {
                  case '1':
                      printf("ONEn");
                      break;
                  case '2':
                      printf("TWOn");
                      break;
                  defa1ut:
                      printf("NONEn");
          }
          return 0;
  }

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

下面这个程序输出什么?
  #include<stdio.h>
  int main()
  {
      int a=1;
      switch(a)
      {   int b=20;
          case 1: printf("b is %dn",b);
                  break;
          default:printf("b is %dn",b);
                  break;
      }
      return 0;
  }

下面这个程序输出什么?
  #include <stdio.h>
  int main()
  {
      int i;
      i = 10;
      printf("i : %dn",i);
      printf("sizeof(i++) is: %dn",sizeof(i++));
      printf("i : %dn",i);
      return 0;
  }

下面这个程序输出什么?
  #include <stdio.h>
  #include <stdlib.h>

  #define SIZEOF(arr) (sizeof(arr)/sizeof(arr[0]))

  #define PrintInt(expr) printf("%s:%dn",#expr,(expr))
  int mai
n()
  {
      /* The powers of 10 */
      int pot[] = {
          0001,
          0010,
          0100,
          1000
      };
      int i;

      for(i=0;i<SIZEOF(pot);i++)
          PrintInt(pot[i]);
      return 0;
  }

下面这个程序输出什么?
  #include <stdio.h>
  int main()
  {
    int a=3, b = 5;

    printf(&a["Ya!Hello! how is this? %sn"], &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;
  }

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

为什么下面这个程序的输出不是10?我故意取消了语法高亮:)
  #include <stdio.h>
  #define PrintInt(expr) printf("%s : %dn",#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;
  }

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

下面这段代码是否合法?
  #include <stdio.h>
  #define PrintInt(expr) printf("%s : %dn",#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));
  }

这是什么意思?有什么潜在的问题?
  #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?

怎样用printf函数打印"I can print %"?别忘了百分号是用于格式化输出的。
不用任何比较运算符,写一个程序找出三个数中的最小数。
不用+号,(用位运算)实现加法运算。

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

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

42 条评论

  • Exile

    sofa….

  • Nova

    我的沙发……就这么消失了……

  • 匿名龙神号

    初学C++语言,完全不懂printf函数……

  • bear

    差点都没做对

  • c

    把这些拿去作C语言考题就有意思了

  • betaver

    代码不高深~不过看得太费脑子了~
    记得有本老外写的书,专门讲C++程序的趣事,这样的代码有半本书…

  • Harok

    联想到了面试[muteness]

  • 袁哲

    怎么不能编译?
      #include<stdio.h>
      int main()
      {
          int a=1;
          switch(a)
          {   int b=20;
              case 1: printf("b is %dn",b);
                      break;
              default:printf("b is %dn",b);
                      break;
          }
          return 0;
      }

  • Satily

    第11个程序因为这一句:
    y = y/*p; /*dividing y by *p */;
    之中的
    y/*p
    中的 “*”“/”之间没有空格,所以会被误认为是注释~~~~

    很经典的问题~~~~

  • haha

    enum {false,true};
    int main()
    {
            int i=1;
            do
            {
                    printf("%dn",i);
                    i++;
                    if(i < 15)
                            continue;
            }while(false);
            return 0;
    }

    原来continue可以和break干相反的事:)

  • ping

    最后那个问题其实最简单

    #include <stdio.h>
      int main()
      {
          while(printf("Hello world!")==1){}
      }

    因为scanf和printf都有返回值~直接输出即可;

  • multiple1902

    怎么不能编译?
      #include<stdio.h>
      int main()
      {
          int a=1;
          switch(a)
          {   int b=20;
              case 1: printf("b is %dn",b);
                      break;
              default:printf("b is %dn",b);
                      break;
          }
          return 0;
      }

    注意语气……我以为是反问……

    晕刚才写验证码38+25我填了3825……

  • ping

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

    哈哈

    #include <stdio.h>
    #include <stdlib.h>

    int max(const void *a,const void *b)
    {
        int ta=*(int *)(a);
        int tb=*(int *)(b);
        return ta-tb;    
    }

    int main(void)
    {
        int a[]={3,2,1};
        qsort(a,3,sizeof(int),max);
        printf("%d",a[0]);
        return 0;
    }

  • ping

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

    这样行不?

    #include <stdio.h>

    int main()
    {
        char c='%';
        printf("I can print %c",c);
        return 0;
    }

  • ping

    呵呵,问m牛一个有趣的问题,很经典~

    能不能写一个程序,让它输出这个程序本身的代码?

  • haha

    #include <cstdio>
    using namespace std;int main(){char a[1000]="#include <cstdio>%c%cusing namespace std;int main(){char a[100]=%c%s%c;char quote=34,enter=13,lf=10;printf(a,enter,quote,a,quote);return 0;}";char quote=34,enter=13,lf=10;printf(a,enter,lf,quote,a,quote);return 0;}

  • dd

    这些在我看来都是无意义的问题。在语言本身深入钻研从来就不是好主意。

    回复:其实,我很同意

  • Satily

    这些在我看来都是无意义的问题。在语言本身深入钻研从来就不是好主意。

    I agree~~~~

    这些程序一般都是程序员们无聊的时候自娱自乐用的~~~~一般没什么意义,不过找Bug是很有意思的事情~~~~

    这大概是学C的好处的其中一条~~~~[razz]

  • sqybi

    这些在我看来都是无意义的问题。在语言本身深入钻研从来就不是好主意。

    只不过是消遣而已…干什么这么认真呢?

  • LuoboTixS

    @ping:我记得近几年的IOCCC有过这样的作品.

  • 独孤

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

    printf("%%");
    不是就行了

  • dahe_1984

    看来c语言很受欢迎啊[heart]

  • dahe_1984

      #include <stdio.h>
      #define f(a,b) a##b
      #define g(a)   #a
      #define h(a) g(a)

      int main()
      {
              printf("%sn",h(f(1,2)));
              printf("%sn",g(f(1,2)));
              return 0;
      }

    这个输出好象一样啊

  • dahe_1984

    #include<stdio.h>
      int main()
      {
              int a=10;
              switch(a)
              {
                      case '1':
                          printf("ONEn");
                          break;
                      case '2':
                          printf("TWOn");
                          break;
                      defa1ut:
                          printf("NONEn");
              }
              return 0;
      }

    switch中编译时不检查均不匹配的情况,数字1都可以通过编译.

  • dahe_1984

    #include<stdio.h>
      int main()
      {
          int a=1;
          switch(a)
          {   int b=20;
              case 1: printf("b is %dn",b);
                      break;
              default:printf("b is %dn",b);
                      break;
          }
          return 0;
      }

    这个有意思,赋值和不赋值一样了!

  • dahe_1984

    收益了,现在公司面试就喜欢出这种的题目.回字有几种写法要搞清

  • dahe_1984

    #define PrintInt(expr) printf("%s : %dn",#expr,(expr))

    这里面预定义后面的# 和 括号怎么理解啊?[stun]

    回复:#表示把它当成字符串插入

  • 强风

    #include
    #define f(a,b) a##b
    #define g(a) #a
    #define h(a) g(a)

    int main()
    {
    printf(“%sn”,h(f(1,2)));
    printf(“%sn”,g(f(1,2)));
    return 0;
    }

    这个一直搞不懂饿,尽管知道了#和##的含义。应该怎么理解啊??大牛?

  • 洱海

    29楼
    #定义会立即字符串化宏参数,不进行进一步的展开了
    所以g不用展开了,而h需要进一步展开

  • 晓而不羽

    貌似 (a>b) 可以用 (abs(a-b)+(a-b)) 来替代

  • bg

    if (a > b)可以替换为
    if (((b – a) & ~(~0U >> 1)))

  • xxx

    膜拜大神的路过

  • C8LUKA

    #include
    #ifndef __cplusplus
    enum bool {true,false};
    #endif
    using namespace std;

    int main()
    {
    int i=1;
    do
    {
    printf(“%dn”,i);
    i++;
    if(i < 15)
    continue;
    }while(false);
    return 0;
    }

  • C8LUKA

    用不了???

  • yyt

    其实很多东西一开编译警告就出来了
    还有第四个在linux无法编译

  • 求道于盲

    看到了成吨的UB

  • 第一次看到这样的帖子

    菜鸟飞过,想大神学习!!

  • FarmerJohn

    膜拜膜拜! 不过…`printf()`的返回值是什么?

发表评论

  +  61  =  65