C语言迷惑行为大赏

代码0:

创新互联建站自成立以来,一直致力于为企业提供从网站策划、网站设计、做网站、成都做网站、电子商务、网站推广、网站优化到为企业提供个性化软件开发等基于互联网的全面整合营销服务。公司拥有丰富的网站建设和互联网应用系统开发管理经验、成熟的应用系统解决方案、优秀的网站开发工程师团队及专业的网站设计师团队。

 
 
 
 
  1. #include 
  2. int main(void) 
  3.     int c = 5; 
  4.     switch(c) 
  5.     { 
  6.         case 0 ... 10: 
  7.             printf("0-->10\n"); 
  8.             break; 
  9.         case 11 ... 20: 
  10.             printf("11-->20\n"); 
  11.             break; 
  12.         default: 
  13.             printf("other\n"); 
  14.     } 
  15.     return 0; 

输出结果:

 
 
 
 
  1. 0-->10 

以上特性被常见编译器支持,但是标准中并未提到。

代码1

 
 
 
 
  1. #include 
  2. int main(void) 
  3.     printf("%m\n"); 
  4.     return 0; 

输出结果:

 
 
 
 
  1. Success 

等价于:

 
 
 
 
  1. printf("%s\n",stderr(errno)); 

由于你的代码前面并没有执行出错设置errno,因此errno会是0,而对应的描述信息就是Success。

代码2

 
 
 
 
  1. #include 
  2. int main(void) 
  3.     int i = 10; 
  4.     printf("%zu\n",sizeof(i++)); 
  5.     printf("%zu\n",sizeof(++i)); 
  6.     printf("%d\n",i); 
  7.     return 0; 

输出结果:

 
 
 
 
  1. 10 

sizeof实际作用的对象是类型。sizeof中的表达式本身并不会被执行。

代码3

 
 
 
 
  1. #include  
  2. #include  
  3. int main(void)   
  4.     while(1) 
  5.     { 
  6.         fprintf(stdout,"公众号"); 
  7.         fprintf(stderr,"编程珠玑"); 
  8.         sleep(10); 
  9.     } 
  10.     return 0; 

输出结果:

 
 
 
 
  1. 编程珠玑编程珠玑编程珠玑 

为什么不会输出公众号呢?原因在于标准输入默认是行缓冲,而标准错误是无缓冲。这在《那些奇奇怪怪的缓冲问题》中已经有解释了。

代码4

 
 
 
 
  1. #include  
  2. int main(void)   
  3.     int a = 10; 
  4.     switch(a) 
  5.     { 
  6.         int b = 20; 
  7.         case 10: 
  8.             printf("%d\n",a + b); 
  9.             break; 
  10.         default: 
  11.             printf("%d\n",a + b); 
  12.             break; 
  13.     } 
  14.     return 0; 

输出结果:

 
 
 
 
  1. 10 

switch中的int b = 20,并不会被执行,你编译时就会发现有警告。

代码4

 
 
 
 
  1. #include  
  2. int main(void)   
  3.     printf("%c\n",4["hello 公众号编程珠玑"]); 
  4.     return 0; 

输出结果:

 
 
 
 

等价于:

 
 
 
 
  1. char *str = "hello 公众号编程珠玑"; 
  2. printf("%c\n",str[4]); 

代码5

 
 
 
 
  1. //来源:公众号编程珠玑 
  2. //https://www.yanbinghu.com 
  3. #include 
  4. int main(void) 
  5.     char arr[] = {'h','e','l','l','o'}; 
  6.     printf("%s\n",arr);//灾难!,可能会崩溃 
  7.     return 0; 

代码6

没啥用,还会core dump的超短代码,可以编译运行:

 
 
 
 
  1. main=0; 

代码7

 
 
 
 
  1. #include 
  2. int main(void) 
  3.     int arr[] = {5,4,3,2,1}; 
  4.     for(int i = -1; i < sizeof(arr)/sizeof(int) - 1; i++) 
  5.     { 
  6.         printf("%d\n",arr[i+1]); 
  7.     } 
  8.     printf("end\n"); 
  9.     return 0; 

输出结果:

 
 
 
 
  1. end 

原因也很简单,sizeof(arr)/sizeof(int)的结果是unsigend, int类型的i 和unsigned比较,被转换为一个很大的unsigned数,所以for循环的条件不满足。

代码8

 
 
 
 
  1. #include 
  2. test() 
  3.     long b = 12345678987654321; 
  4.     return b; 
  5. int main(void) 
  6.     long a = test(); 
  7.     printf("%ld\n",a); 
  8.     return 0; 

输出结果:

 
 
 
 
  1. 1653732529 

代码9

 
 
 
 
  1. #include 
  2. int main(void) 
  3.     float a = 3; 
  4.     int b = 2; 
  5.     printf("%d\n",a/2); 
  6.     return 0; 

输出结果:

 
 
 
 
  1. 1199094392 

原因:浮点数在计算机中按照IEEE754标准存储

分享名称:C语言迷惑行为大赏
标题路径:http://www.csdahua.cn/qtweb/news25/495675.html

网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网