本文共 750 字,大约阅读时间需要 2 分钟。
昨天网友问到一个好奇怪的问题,当时也没有想通,现在解释:
首先这里有两个貌似完全一样的代码:::
#include<stdio.h> int main() { int x = 5.0; printf("%d\n",x); return 0; } #include<stdio.h> int main() { printf("%d\n",5.0); return 0; } 大家可以测试一下,第一个输出的是5, 第二个是一个垃圾数; 其实这个问题想通了也是很easy、的,本质就是“类型转化”和“printf”函数处理机制! printf()是通过把参数从右到左的顺序压栈的;如printf("a= %d b = %d", i, j );会先压 j 然后压 i 然后压这个串" a = %d b= %d " 的首地址所以这个调用总共要压三个参数;不管你要几个参数都好,第一个参数一定要是一个串的地址;这个地址是最后压栈的;printf()函数是不知道你到底传来几个参数的,只是当我需要参数的时候,就去调用那个高层栈元素进来,所以例如:printf( "AAA %d" );后面是没有参数的话,那么默认是给你一个垃圾数;同时也是有一个类型匹配的机制的,if说你的参数类型和输出的格式是不匹配的话,那么他也是给你一个垃圾数!就像本文的第二个代码!那么第一个代码为什么可以呢,那主要是在我们int x = 5.0的时候已经有了一个强转了,就是说此时的x就已经是5而不是5.0了!!! 而第二个DEMO中的5.0说都不知道是什么,相当于是没有类型的值而已! 所以我们以后写程序都要规范化,按部就班,不要投机取巧,还有原理的东西都是很重要的呗!呵呵!大家一起加油!~ 转载地址:http://aoaci.baihongyu.com/