C语言编程新手为什么这个变量在-=操作后不更新?

wztqucjr  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(121)
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
}

不确定它是否与指针/内存地址/如何处理以及如何解决这个问题有关。

mcvgt66p

mcvgt66p1#

testint。您的printf代码f告诉它您传递了一个double。在许多架构/调用约定(包括标准x86-64约定)中,变量在完全不同的寄存器中传递,因此它甚至没有在正确的位置查找。在其他情况下,变量可能会传递到同一个存储位置(例如,在堆栈上),但是将int解释为double会产生乱码(当int的大小是double的一半时,您会读取其中一半的垃圾位)。
将其更改为:

printf("%.2d", test);

使它正确地期望testint,或者保持printf不变,并更改test的声明,使其成为double而不是int

drnojrws

drnojrws2#

int main() {
    int minutes = 245;
    double hours = (double) minutes / (double) 60.0;

60.0已经是一个double文本,所以不需要强制转换。也不需要将minutes转换为double,因为除法将在双精度上进行,因为一个双精度操作数强制另一个转换为double(因此,minutes将在除法之前转换为double

printf("%.2f\n", hours); // prints 4.08

这是正确的,没什么可说的。

hours -= (double) 3.0;

hours被更改为1.08

int test = hours * .5;

test变成了这个量的一半(0.54),转换成int(因为它是这样声明的),或0

printf("%.2f", test);  // also prints 4.08 despite -= operator

这将调用Undefined behavior,因为您正在告诉printf()使用double数据(与%.2f说明符一样),但您正在向它传递int(并且,由于浮点数通常在数学协处理器上的某些寄存器中处理而整数位于某些整数CPU寄存器中,它不会得到hours的内容(现在是1.08),而是一些协处理器寄存器的先前内容,完全无关。编译器已经警告你这个事实,因为你的参数不匹配格式说明符(如果你做了#include <stdio.h>,就会发生这种情况),或者(如果你没有做)你因为使用了一个函数(printf)而没有声明(这是非常坏的习惯,容易出错)而被警告。
下面的代码将显示hourstest的内容:(请不要忘记#include <stdio.h>,因为如果您使用printf(),则需要它)

#include <stdio.h>

int main()
{
    int minutes = 245;
    double hours = minutes / 60.0;
    printf("hours=%.2f\n", hours); // prints 4.08

    hours -= 3.0; /* hours becomes 1.08 */
    int test = hours * .5; /* test will become the integer part of hours/2.0 -> 0.54 */
    printf("hours=%.2f\ntest=%d\n", hours, test);
}

这将产生:

$ a.out
hours=4.08
hours=1.08
test=0

果然

wn9m85ua

wn9m85ua3#

你的代码运行良好。变量hours正在更新。正如你提到的,你是C编程的新手。您可能不知道如何使用调试器。所以,对于初学者,我建议你试着在每个陈述后面印上指纹。它将帮助您更好地理解代码流。

#include <stdio.h>

int main( ) {
    int minutes = 245;
    double hours = (double) minutes / (double) 60.0;
    printf("%lf\n", hours); //4.083333

    hours -= (double)3.0; 
    printf("%lf\n", hours); // 1.083333   
    int test = hours * 0.5;
    double test1 = hours * 0.5;
    printf("%lf\n", test);//0.000000
    printf("%lf", test1); // 0.541667   
}

相关问题