一元加运算符在指针初始化中有什么用?

What is the use of unary plus operator in pointer initialization?

我知道 C 和 C++ 都是不同的语言,今天我在下面的程序中犯了一点错字,但该程序在各种 C++ 编译器(g++、clang、MSVC++)上编译得很好

考虑以下程序:

int main()
{
    int s[]={3,6,9,12,18};
    int* p=+s;  // Observe this strange looking initialization due to use of unary + operator
}

以上程序在 C++ 中编译良好(参见现场演示 here) but not in C (See live demo here。)当我将其编译为 C 程序时,我的编译器 ( gcc 4.8.1 ) 出现以下错误。

[Error] wrong type argument to unary plus

一元加运算符在这里有什么用?它到底在这里做什么?为什么在 C 中不允许?

当调用 + 运算符时,

s 将被视为指针而不是数组。

对于C,好像还没有引入这个概念

What purpose the unary plus operator serves here?

在 C++ 中,行为在第 5.3.1 节中列出:

[2] The result of each of the following unary operators is a prvalue.

[7] The operand of the unary + operator shall have arithmetic, unscoped enumeration, or pointer type and the result is the value of the argument.

有时人们使用这个运算符来“强制”衰减,即在这种情况下是指向指针的数组。但它是相当多余的,因为转换是自动发生的。

What it does exactly here? Why it is not allowed in C?

因为特殊含义根本不存在

section 6.5.3.3 of C99 状态:

1) The operand of the unary + or - operator shall have arithmetic type; ......

2) The result of the unary + operator is the value of its (promoted) operand. The integer promotions are performed on the operand, and the result has the promoted type.

指针或数组不是算术类型。

我只见过在一元 + 运算符在 C++ 等 OOP 语言中被重载的情况下使用。它在 C 中没有任何用途,除了可能导致这样的错误,即指针被意外传递给宏或不期望的函数。

无论哪种方式编写代码都是一种令人讨厌的方式,如果有充分的理由,那么它应该附有原作者的解释性评论。