一元加运算符有什么作用?我发现了几个定义(这里这里)但我还是不知道它有什么用。看起来好像没什么作用,但总有原因吧?

有帮助吗?

解决方案

它的存在,如果你觉得有必要超载;对于所有预定义类型它本质上是一个空操作。

无操作一元算术运算器的实际应用是相当有限的,并且趋向于涉及在一个算术表达式使用值,而不是操作者本身的后果。例如,它可以被用来强制从较小的整数类型加宽到int,或确保这样的表达式的结果被视为一个右值,因此不具有非const参考参数相兼容。我提出,然而,这些用途更适合代码高尔夫比可读性。 : - )

其他提示

实际上,一元加 做某事——即使是在 C 语言中。它执行 常见的算术转换 操作数上并返回一个新值,该值可以是更大宽度的整数。如果原始值是宽度小于的无符号整数 int, ,它将被更改为 signed 值也。

通常这并不那么重要,但它 有效果,所以是 不是 使用一元加作为一种“注释”表示整数是正数是个好主意。考虑以下 C++ 程序:

void foo(unsigned short x)
{
 std::cout << "x is an unsigned short" << std::endl;
}

void foo(int x)
{
 std::cout << "x is an int" << std::endl;
}

int main()
{
 unsigned short x = 5;
 foo(+x);
}

这将显示“x is an int”。

所以在这个例子中一元加创建了一个不同类型的新值 签名性。

从K&R第二版:

  

一元+是新与ANSI标准。它被添加为对称与一元 -

我已经看到了用于清楚起见,强调从负值正值作为不同:

shift(+1);
shift(-1);

但是,这是一个相当薄弱的使用。答案是肯定超载。

一件事内置一元+确实正在转向左值到右值。例如,可以这样做

int x;
&x;

但你不能做到这一点。

&+x;

:)

P.S。 “重载”绝对不是正确的答案。一元+被选自C继承而且也没有用户级操作者用C过载。

一元+完成最主要的是类型提升到比int小的数据类型的int。这是非常有用的,如果你想打印使用std::cout作为数字数据字符数据。

char x = 5;
std::cout << +x << "\n";

是非常不同的从

char x=5;
std::cout << x << "\n";

这也适用于重载,但在实践中的过载的应该的是近NOP。

如果您需要打印调试或任何原因原始字节(存储为字符例如,小的数字)的数值,一元+可以简化打印代码。考虑

char c = 42;
cout << c << endl;           // prints "*\n", not what you want in this case
cout << (int)c << endl;      // prints "42\n", ok
cout << +c << endl;          // prints "42\n", much easier to type

这仅仅是一个简单的例子。我相信还有其他的时候,一元+可以帮助治疗字节更像是数字,而不是像文本。

一个历史珍闻。 C99的标准化委员会也认为一元现有用途加了相当罕见的,由他们考虑重新使用,以实现在语言的另一个特点就是证明:抑制浮点常量表达式转换时的评价。请参见下面的引用从C理由,部分F.7.4:

  

的早期版本的本说明书允许的平移时间常数运算,但   授权一元+运算,当施加到操作数,以抑制翻译时   常量表达式的评估。

在结束时,将语义被颠倒,在大多数情况下执行(至少直到“如同”规则)运行时的评价,以及通过使用静态初始化的执行翻译时计算的能力。注意,主要区别在于浮点异常的发生,和其他浮点舍入或精度设置,当存在。

不多。允许operator+()的过载一般的说法是有一定现实世界中使用重载operator-(),这将是的非常的怪异(或不对称),如果你要允许超载operator-()但不operator+()

我相信,我第一次读Stroustrop这种说法,但我没有我的书和我的权利,以验证它。我可能是错的。

一元加号存在于C,其中它没有绝对没有(很像auto关键字)。为了没有它,Stroustrup的将不得不引入用C无端的不相容性。

在它是在C ++中,人们很自然地允许过载功能,就像一元减号和Stroustrup的可能已经推出了它出于这个原因,如果它不是已经存在。

所以,这意味着什么。它可以作为作为排序的装饰,使事情看起来更加匀称,使用+1.5作为相反-1.5为例。在C ++中,它可以被重载,但它是怎么回事,如果operator+()做任何事情是混乱。记住标准的规则:重载算术运算符的时候,做事情喜欢ints做

如果你正在寻找一个理由,为什么它的存在,找到一些关于C的早期历史,我怀疑有没有很好的理由,因为下没有真正的设计。考虑无用auto关键字(大概对比static,现在的C ++ 0x被回收)和entry关键字,它从来没有任何东西(后来在C90省略)。有一个著名的电子邮件中,里奇或Kernighan的说,当他们意识到运算符优先级有问题,有已经是三个安装有上千行的代码,他们不希望打破。

我无法引用任何来源,但我开始了解到它是用于显式类型提升,这意味着无损类型转换。这将其置于转换层次结构的顶部,

  • 晋升: new_type operator+(old_type)
  • 转换: new_type(old_type)
  • 投掷: operator(new_type)(old_type)
  • 强迫: new_type operator=(old_type)

当然,这是我对 15 年前读过的一本微软(非常古老的)c/c++ 手册中的注释的解释,所以请对此持保留态度。

#include <stdio.h>
int main()
{
    unsigned short x = 5;
    printf ("%d\n",sizeof(+x)); 
    printf ("%d\n",sizeof(x)); 
    return 0;
}

如上面的示例中所示,一元+真正改变类型,大小分别4和2。奇怪的是,表达+ x是确实的sizeof计算,我认为这是不应该。也许这是由于以下事实的sizeof具有相同的优先级一元+。

我想你可以用它来总是会让一些积极。只是重载一元+运算符是ABS。不值得混淆你的同胞开发商,除非你真的只是想混淆你的代码。然后,它会很好地工作。

修改完全重写了,因为我是waaaayyy掉在我原来的答复。

这应该让你处理你的类型为正值的明确声明(我想大多在非数学运算)。看来,否定会比较有用,但我想这里有一个地方可以有所作为的一个例子:

public struct Acceleration
{
    private readonly decimal rate;
    private readonly Vector vector;

    public Acceleration(decimal rate, Vector vector)
    {
        this.vector = vector;
        this.rate = rate;
    }

    public static Acceleration operator +(Acceleration other)
    {
        if (other.Vector.Z >= 0)
        {
            return other;
        }
        return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
    }

    public static Acceleration operator -(Acceleration other)
    {
        if (other.Vector.Z <= 0)
        {
            return other;
        }
        return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
    }

    public decimal Rate
    {
        get { return rate; }
    }

    public Vector Vector
    {
        get { return vector; }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top