2025年3月29日 星期六 甲辰(龙)年 月廿八 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > C语言

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

时间:11-18来源:作者:点击数:63

下面这个程序输出什么?

  • 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/index.php

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门