C ++-我应在代码的哪儿包含static_cast?

问题描述

我的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_castgrade1等)的数量被计算为整数值(例如,数组中元素的数量)。

您可以做的第三件事是从输出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(),它将是一个整数,并且您必须将其转换为某个位置。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...