【问题标题】:vala: quotient of two integers is always an integer. Why?vala:两个整数的商始终是整数。为什么?
【发布时间】:2016-02-10 02:01:16
【问题描述】:

新手问题:

void main () {
    int A = 1;
    int B = 2;
    double C = A / B;
    stdout.printf("C value is: %g\n", C);
}

这会打印:“C 值是:0”

void main () {
    int A = 1;
    double B = 2;
    double C = A / B;
    stdout.printf("C value is: %g\n", C);
}

这会打印:“C 值是:0.5”

我不明白为什么两种情况下结果都不是 0.5。

【问题讨论】:

    标签: vala


    【解决方案1】:

    除法运算是对两个整数进行的,所以结果是一个整数。事后将其分配给 double 的事实并没有改变这一点。

    您在问题中所做的,以及明确的隐式转换,是

    int A = 1;
    int B = 2;
    double C = (double) (A / B);
    

    但是,如果要使用双精度执行除法运算,则必须将至少一个操作数显式转换为双精度:

    int A = 1;
    int B = 2;
    double C = ((double) A) / B;
    

    有关算术运算的规则,请参阅arithmetic expressions section of the Vala Manaual。相关位:

    如果两个操作数都是整数类型,则结果将只是计算的商(相当于精确答案向下舍入为整数值。)如果任一操作数是浮点类型,则结果将在结果类型的边界内尽可能精确(这是从基本算术类型规则中得出的。)

    【讨论】:

    • C 具有“通常的算术转换”,这是在表达式中使用不同数字类型时的一组规则。该标准实现了跨编译器的一致性,但不一定是“显而易见的”,因为它涉及数字类型的隐式转换。没有经验的程序员或有不同语言经验的程序员可能会被规则抓住。这可能会导致结果中出现意外的精度损失。请参阅 MISRA C 指南以尝试解决此问题。 Vala 编译为 C 代码,据我了解,它遵循相同的类型转换规则。
    • “显而易见”的事情是(有趣的是,我在您发表评论之前将其编辑掉)参考了一个示例,我在发布之前决定删除我询问 var C = A / B; 中的 C 类型的地方将是。 Vala 编译为 C,但这不是为什么在这种情况下它是相同的;语言规范明确定义了相同的行为。
    • 是的,一旦我发现您更改了措辞,我应该删除明显的双引号 :) Vala 手册的部分非常简洁。它有助于明确当数字类型具有不同宽度时结果将是什么类型的隐式转换规则,例如int32 和 int64,或不同的数字格式,例如整数和双精度。
    猜你喜欢
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-28
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 2016-09-29
    相关资源
    最近更新 更多