问题描述
我的static_cast似乎不起作用。我在代码的开头创建了5个int变量,并在对其他4个变量执行计算后尝试将一个(总数)更改为双精度,但是它一直显示int。
#include <iostream>
#include <iomanip>
#include <cstdlib>
using namespace std;
int main ()
{
int grade1,grade2,grade3,grade4,avg;
cout << "Please input four grades: " << endl;
cin >> grade1;
cin >> grade2;
cin >> grade3;
cin >> grade4;
avg = (grade1 + grade2 + grade3 + grade4) / 4;
cout << "Grades: " << grade1 << "," << grade2 << "," << grade3 << "," << grade4 << endl;
cout << "\n";
cout << "Average grade: " << static_cast<double>(avg) << endl;
return 0;
}
解决方法
合并整数并将其分配给avg
时。
您已经进行了整数舍入转换,因此在将数字分配给avg
结果之前,您需要进行静态转换。
只要除以4.0,并将avg
设为两倍,您甚至都不需要使用静态强制转换。
示例:
double avg = static_cast<double>(grade1+grade2+grade3+grade4) / 4.0;
// Alternative without static that still works
double avg = (grade1+grade2+grade3+grade4) / 4.0;
,
我建议您对“我的代码应在哪里包含static_cast的问题”的字面回答。非常简单:无处不在。
static_cast
-与所有C ++ _cast
运算符一样,应尽可能避免所有显式(C样式)类型转换。它们有其用途,但是最好将其使用减到最少,并且一定要避免将它们用作解决代码问题的钝器。
对于您而言,通过使用适当类型的变量以及具有适当类型的所有文字值,可以非常简单地获得正确的结果。
首先,avg
必须为double
类型。这涉及更改
int grade1,grade2,grade3,grade4,avg;
到
int grade1,grade4;
double avg;
第二,avg
的值的计算需要更改,因此它不进行整数除法。这意味着改变
avg = (grade1 + grade2 + grade3 + grade4) / 4;
(这不起作用,因为grade1
,... grade4
都是int
类型,它们的和是int
,文字是{{1} }是4
,将两个int
相除会产生int
)
int
这可行,因为文字avg = (grade1 + grade2 + grade3 + grade4) / 4.0; // note the 4.0
的类型为4.0
。值double
计算为(grade1 + grade2 + grade3 + grade4)
,但是由于将其除以int
,因此该整数值在执行除法之前会隐式转换为double
-结果的类型为double
。
这是我在这里唯一考虑使用double
并将static_cast
转换为4
的地方。
double
,其净效果与先前计算的avg = (grade1 + grade2 + grade3 + grade4) / static_cast<double>(4);
相同。在您的代码中,它没有什么区别。但是avg
在更多通用代码中可能很有用,例如,如果输入值(static_cast
,grade1
等)的数量被计算为整数值(例如,数组中元素的数量)。
您可以做的第三件事是从输出grade2
的语句中删除static_cast
,因为它现在是多余的(将avg
转换为double
无效) 。换句话说,转
double
到
cout << "Average grade: " << static_cast<double>(avg) << endl;
,
您的代码中有两个问题。 首先是您将avg声明为int,因此结果将始终舍入为int。
但是,将avg声明为double并不能立即解决您的问题。在C ++中,运算符在相同类型的对象上执行,结果是相同类型的对象。
(grade1 + grade2 + grade3 + grade4)
是一个整数,而4
是一个整数,因此结果将是一个整数。稍后将其隐式或显式强制转换为double都没有关系,您仍将获得四舍五入的结果。
如果操作数不是同一类型,则编译器将隐式提升一个以匹配另一个。以下几行将为您提供正确的结果:
static_cast<double>(grade1 + grade2 + grade3 + grade4) / 4;
(grade1 + grade2 + grade3 + grade4) / 4.0;
static_cast<double>(grade1 + grade2 + grade3 + grade4) / 4.0;
,
int
不能保留小数位。 int
/
产生int
,没有小数。您需要使用正确的/
,即至少使用one of the operands must be double
to get a double
result。
#include <iostream>
int main () {
std::cout<<"Please input four grades: "<<std::endl;
int grade1,grade4;
std::cin>>grade1;
std::cin>>grade2;
std::cin>>grade3;
std::cin>>grade4;
double avg=static_cast<double>(grade1+grade2+grade3+grade4)/4;
std::cout<<"Grades: "<<grade1<<","<<grade2<<","<<grade3<<","<<grade4<<std::endl<<std::endl;
std::cout<<"Average grade: "<<avg<<std::endl;
}
这里不需要静态转换,因为您可以将int
文字4
更改为double
文字4.0
,但是如果要对元素求和向量,然后在其上调用size()
,它将是一个整数,并且您必须将其转换为某个位置。