下面这四张图到底是为啥?

来源:学生作业帮助网 编辑:六六作业网 时间:2024/12/22 10:45:27
下面这四张图到底是为啥?下面这四张图到底是为啥?下面这四张图到底是为啥?这个不算奇怪.printf由于输出列表可变,因此函数没有原型,不做强制转换;如果类型不匹配,比如int作浮点输出,行为可以是不定

下面这四张图到底是为啥?
下面这四张图到底是为啥?



下面这四张图到底是为啥?
这个不算奇怪.
printf由于输出列表可变,因此函数没有原型,不做强制转换;如果类型不匹配,比如int作浮点输出,行为可以是不定的,由各个编译器自行处理.
① i = 50,这个整数,在电脑里面存储格式是16进制的0x32.printf的时候,如果没有强制转换((float)i),而是按照float来理解i,那么0x32,按浮点数换算,就是十进制的0 (这个是在一般的汇编教材中的浮点章节都有说明,网上的教程也很多); 而如果类型转换了,浮点数50.0的16进制应该是0x42480000.
② 这个有点问题.如果你显示的是完整的,那么应该是和你的编译器有关.看你的截图,应该是64位Windows下的Dev-C++环境.但不知道你的编译器是MinGW 32位还是TDM-GCC x64?如果是,应该检查编译器本版是多少?尽量下载新的,稳定版本.你是在Dev-CPP的集成环境中直接F10运行结果的吧?建议没有修改代码后,先F12重建一下,然后再运行.
这个在我的测试环境里面,显示的是50 0.000000 50
③ 这个问题同前.printf因为可以接受动态格式数组,所以特意设计成运行时刻才决定行为的.也许是某版本的编译器的问题,导致了数据对齐或边界溢出问题.如果可能,可否说明编译环境,或干脆附上你的全部工程文件?
④ 这个好理解.&i是变量i的内存地址,因此最后打印的不是i的值,而是i的地址所对应的16进制地址,然后被按照%d的十进制表示出来了.
关于图2,3里面的最后一位i,对照图4里面的&i,怎么感觉你前面都是按照&i输出的?