我正在尝试编写一些代码,它根据用户提供的变量进行一些计算。变量可以是几种类型,其中包括Integer或Decimal,这就是问题所在。当我进行计算时,我声明要计算的数字和结果为double
。但是,当BOTH数字是整数时,我希望结果也是int
。也就是说,我尝试了类型转换,说出以下内容:
float result;
float num1, num2;
if (strcmp(varray[var1].type, "Integer\n") == 0 && flag != 1){
if (varray[var2].type[0] == 'I'){
(int)num1 = atoi(varray[var1].value);
printf("The result type is Integer \n");
(int)num2 = atoi(varray[var2].value);
(int)result = num1 + num2;
printf("Result =%d\n", result);
flag = 1;
}
}
我在输入到(int)的行上遇到编译器错误,标题上显示消息。我在这里做错了吗?我应该只声明数字并产生条件,而不是在它之前声明它们并在其中输入?
答案 0 :(得分:1)
你需要施放rvalue(atoi的结果)而不是左值(num1):
num1 = (float)atoi(varray[var1].value);
答案 1 :(得分:0)
(int)num1
被视为 rvalue,之所以被调用,因为它应该位于赋值语句的右侧。
如果您想将右侧投射到更适合左侧变量的位置,则右侧是您要执行此操作的位置,例如:
num1 = (float) atoi (varray[var1].value);
这是完全有效的,但如果你的整数足够大 1 ,你可能会失去精确度。它也是不必要的,因为C会很乐意自动地为你转换它。你可以使用:
num1 = atoi (varray[var1].value);
你也遇到过这样的问题:
float result = 32.0f;
printf("Result =%d\n", result);
如果格式说明符与参数类型不匹配,则行为未定义。在这种情况下,您指定的整数为%d
,但给出浮点值。
如果要打印没有小数的浮点值,则使用%.0f
作为格式说明符(%f
本身将给出小数点后的默认位数,如{ {1}})。
1 除非您使用数百万个浮点值的数组,并且空间紧张,否则您所使用的32.000000
系统将具有明显且必需的性能优势,你真的应该在可能的情况下选择双打。它们的范围和精度要好得多。