LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1685|回复: 6

再谈C++的符号重载

[复制链接]
发表于 2009-11-3 17:16:41 | 显示全部楼层 |阅读模式
double a;
……
if (0 = a) {
……
这段代码错了吗?如果是C++,它可能是正确的!
一个提示是:任何语言里面都不要去直接判断一个浮点数是否等于零,而是应该判断这个浮点数与零的差的绝对值是否小于某一个精度。永远记住浮点数只能比较大于、小于,不能直接比较等于。除非……

是的,这里“=”被重载了,因为这样写起来、读起来更符合逻辑。所以,另一个提示是:总是把常数写在左边。
double a, b;
……
if (a = b)
错了吗?永远为真?该死的注释呢,“=”是否被重载了?

也许你习惯了重载过的“=”而忽视了这个细节,也许你在面试的过程中发现别人“好像”是犯了个低级错误。当然有的人喜欢重载“==”,不过我觉得还是重载“=”好,至少常数写在左边且没引用到浮点数重载的头文件时,编译器会报错。
Every program in paper is a fake, test it.
发表于 2009-11-3 17:50:39 | 显示全部楼层
好吧,难道是我记错了,怎么重载这个=号,就拿上面的两个例子来说
回复 支持 反对

使用道具 举报

发表于 2009-11-4 00:26:02 | 显示全部楼层
用==判断有什么不妥么?
回复 支持 反对

使用道具 举报

发表于 2009-11-4 09:33:21 | 显示全部楼层
印象中赋值号是不能以这种形式被重载的。只有左值为对象时才能被重载。——其他符号才可以。

但是,有关那个提示。。。其实那个提示没有什么科学道理,可笑的是很多人只知道重复这个理论却没有几个人质疑过这个理论是否正确。

也就是说:可以把浮点数与零比较,而且在现在常见的一些情况下,"必须"把浮点数与零比较,而"绝不能"使用精度比较。

我知道多数人在编程中其实很少使用浮点,但其实,对于浮点经验不足的人而言,不使用浮点才是最好的避免错误的办法,而不是盲目听信那种“用精度比较”的片面理论。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-4 14:54:29 | 显示全部楼层

承认错误

首先感谢大家参与讨论。并且这里我要承认自己犯下的错误。这样的程序应该是编译通不过的吧?那么请允许我把所有的double改成Double吧。

所有重载运算符都需要复杂类型而不能使用简单类型。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-11-4 15:06:00 | 显示全部楼层
为了让讨论更有意义,请考虑如下的问题。
假设我用信用卡消费了100元,每次我都还最低还款10%,多少次能够还清?一共要还多少钱?日息为万分之五,为了简单起见,按30天计息。

#include <iostream>
#include <math.h>
using namespace std;

double round(double x) {
        double v = 100 * x;
        v = (x < 0) ? ceil(v - .5) : floor(v + .5);
        return v / 100;
}

int main() {
        const double deviation = 1E-2;
        double restAmount = 100;
        double totalPayed = 0;
        double shouldPay = 0;
        int payTimes = 0;
        while (restAmount > deviation) {
                payTimes++;
                cout << "Times " << payTimes << ": ";
                restAmount = round(restAmount * (1 + 30 * 5E-5));
                if (restAmount < .05)
                        shouldPay = round(restAmount);
                else
                        shouldPay = round(restAmount * 0.1);
                totalPayed += shouldPay;
                cout << "you should pay " << shouldPay << ",";
                restAmount -= shouldPay;
                cout << "and still have " << restAmount << " debt." << endl;
        }
        cout << "You should pay " << payTimes << " times." << endl;
        cout << "You should pay total amount:" << totalPayed;
        return 0;
}

硬件平台为IA32,编译器为GCC 3.4.5。看结果按最低还款好像比分期还划算?不过这个不是问题的重点,明天有空的时候我再来改改这个程序表达我想说的东西。欢迎大家参与讨论,谢谢。
回复 支持 反对

使用道具 举报

发表于 2009-11-12 21:06:43 | 显示全部楼层
学习ing...
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表