设为首页 加入收藏

TOP

C语言的谜题(六)
2013-01-01 14:58:44 来源: 作者: 【 】 浏览:2388
Tags:语言

 

  8、请问下面的程序输出什么?

  #include 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;

  }

  参考答案:如果你觉得输出分别是,10,4,11,那么你就错了,错在了第三个,第一个是10没有什么问题,第二个是4,也没有什么问题,因为是32位机上一个int有4个字节。但是第三个为什么输出的不是11呢?居然还是10 原因是,sizeof不是一个函数,是一个操作符,其求i++的类型的size,这是一件可以在程序运行前(编译时)完全的事情,所以,sizeof(i++)直接就被4给取代了,在运行时也就不会有了i++这个表达式。

  9、请问下面的程序的输出值是什么?

  #include

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

  }

  参考答案:好吧,如果你对于PrintInt这个宏有问题的话,你可以去看一看《语言的歧义》中的第四个示例。不过,本例的问题不在这里,本例的输出会是:1,8,64,1000,其实很简单了,以C/C++(www.cppentry.com)中,以0开头的数字都是八进制的。

  10、请问下面的程序输出是什么?(绝对不是10)

  #include

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

  }

  参考答案:本题输出的是100.为什么呢?问题就出在 y = y/*p;上了,我们本来想的是 y / (*p) ,然而,我们没有加入空格和括号,结果y/*p中的 /*被解释成了注释的开始。于是,这也是整个恶梦的开始。

  11、下面的输出是什么?

  #include int main()

  {

  int i = 6;

  if( ((++i < 7) && ( i++/6)) || (++i <= 9))   ;

  printf("%d\n",i);

  return 0;

  }

  参考答案:本题并不简单的是考前缀++或反缀++,本题主要考的是&&和||的短路求值的问题。所为短路求值:对于(条件1 && 条件2),如果"条件1"是false,那"条件2"的表达式会被忽略了。对于(条件1 || 条件2),如果"条件1"为true,而"条件2"的表达式则被忽略了。所以,我相信你会知道本题的答案是什么了。

  12、下面的C程序是合法的吗?如果是,那么输出是什么?

  #include 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;

  }

  参考答案:

  本例是合法的,输出如下:

  Hello! how is this super

  That is C !

  本例主要展示了一种另类的用法。下面的两种用法是相同的:

  "hello"

  2["hello"]

  如果你知道:a[i] 其实就是 *(a+i)也就是 *(i+a),所以如果写成 i[a] 应该也不难理解了。

        

首页 上一页 3 4 5 6 7 8 下一页 尾页 6/8/8
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言基础之细节 下一篇C语言没有布尔类型的说明

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: