int main() {
int minutes = 245;
double hours = (double) minutes / (double) 60.0;
printf("%.2f\n", hours); // prints 4.08
hours -= (double) 3.0;
int test = hours * .5;
printf("%.2f", test); // also prints 4.08 despite -= operator
}
不确定它是否与指针/内存地址/如何处理以及如何解决这个问题有关。
3条答案
按热度按时间mcvgt66p1#
test
是int
。您的printf
代码f
告诉它您传递了一个double
。在许多架构/调用约定(包括标准x86-64约定)中,变量在完全不同的寄存器中传递,因此它甚至没有在正确的位置查找。在其他情况下,变量可能会传递到同一个存储位置(例如,在堆栈上),但是将int
解释为double
会产生乱码(当int
的大小是double
的一半时,您会读取其中一半的垃圾位)。将其更改为:
使它正确地期望
test
是int
,或者保持printf
不变,并更改test
的声明,使其成为double
而不是int
。drnojrws2#
60.0
已经是一个double
文本,所以不需要强制转换。也不需要将minutes
转换为double
,因为除法将在双精度上进行,因为一个双精度操作数强制另一个转换为double
(因此,minutes
将在除法之前转换为double
)这是正确的,没什么可说的。
hours
被更改为1.08
。而
test
变成了这个量的一半(0.54),转换成int
(因为它是这样声明的),或0
。这将调用Undefined behavior,因为您正在告诉
printf()
使用double
数据(与%.2f
说明符一样),但您正在向它传递int
(并且,由于浮点数通常在数学协处理器上的某些寄存器中处理而整数位于某些整数CPU寄存器中,它不会得到hours
的内容(现在是1.08),而是一些协处理器寄存器的先前内容,完全无关。编译器已经警告你这个事实,因为你的参数不匹配格式说明符(如果你做了#include <stdio.h>
,就会发生这种情况),或者(如果你没有做)你因为使用了一个函数(printf
)而没有声明(这是非常坏的习惯,容易出错)而被警告。下面的代码将显示
hours
和test
的内容:(请不要忘记#include <stdio.h>
,因为如果您使用printf()
,则需要它)这将产生:
果然
wn9m85ua3#
你的代码运行良好。变量
hours
正在更新。正如你提到的,你是C编程的新手。您可能不知道如何使用调试器。所以,对于初学者,我建议你试着在每个陈述后面印上指纹。它将帮助您更好地理解代码流。