类型转换时,左值作为赋值的左操作数

时间:2015-05-07 03:03:42

标签: c casting

我正在尝试编写一些代码,它根据用户提供的变量进行一些计算。变量可以是几种类型,其中包括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)的行上遇到编译器错误,标题上显示消息。我在这里做错了吗?我应该只声明数字并产生条件,而不是在它之前声明它们并在其中输入?

2 个答案:

答案 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系统将具有明显且必需的性能优势,你真的应该在可能的情况下选择双打。它们的范围和精度要好得多。