一元加号运算符在指针初始化中的用途是什么? P>我知道C++和C++都是不同的语言,今天我在下面的程序中做了一个小键入,但是程序在各种C++编译器(G++,CLAN,MSVC++)上编译得很好

一元加号运算符在指针初始化中的用途是什么? P>我知道C++和C++都是不同的语言,今天我在下面的程序中做了一个小键入,但是程序在各种C++编译器(G++,CLAN,MSVC++)上编译得很好,c,arrays,pointers,unary-operator,C,Arrays,Pointers,Unary Operator,考虑以下计划: int main() { int s[]={3,6,9,12,18}; int* p=+s; // Observe this strange looking initialization due to use of unary + operator } < >以上程序编译C++中的精细(见实况演示)但不在C(见实况演示)。当编译器编译为C程序时,我的编译器(GCC 4.8-1)给了我以下错误。 [Error] wrong type argument to un

考虑以下计划:

int main()
{
    int s[]={3,6,9,12,18};
    int* p=+s;  // Observe this strange looking initialization due to use of unary + operator
}
< >以上程序编译C++中的精细(见实况演示)但不在C(见实况演示)。当编译器编译为C程序时,我的编译器(GCC 4.8-1)给了我以下错误。
[Error] wrong type argument to unary plus

一元加号运算符在这里的作用是什么?它到底在这里做什么?为什么C中不允许使用它?

s
在调用+运算符时将被视为指针而不是数组

对于C,这个概念似乎还没有被引入

一元加号运算符在这里的作用是什么

在C++中,行为在5.3.1节:

中列出。 [2] 以下每个一元运算符的结果都是一个prvalue

[7] 一元
+
运算符的操作数应具有算术、非作用域枚举或指针类型,结果为参数值

有时人们使用此运算符“强制”衰减,即在本例中,数组指向指针。但这是相当多余的,因为转换是自动进行的

它到底在这里做什么?为什么C中不允许使用它

因为特殊含义根本不存在。

状态:

1) 一元+或-运算符的操作数应为算术类型; ……

2) 一元+运算符的结果是其值(提升) 操作数。整数提升在操作数上执行,而 结果具有提升类型


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

我只见过这种情况,在一元操作符中,在一个OOP语言中,像C++一样重载。它在C中没有任何用途,除了可能导致这样的错误,指针被意外地传递到宏或不需要的函数


“无论哪种方式,编写代码都是一种讨厌的方式,如果有一个很好的理由,那么它应该附有一个来自原作者的解释性注释。< / P > @ JoachimPileborg:我已经期待这样的评论,说“C和C++是完全不同的语言”。这就是为什么我在我的问题中已经提到了这句话。@JoachimPileborg我想OP明白这一点。然而,很有趣的是,为什么在C和C++中处理这个问题的方式不同。可能的复制品是更好的复制品:@奥拉夫,因为C和C++是非常密切相关的。即使Stroustrup的FAQ仍然有这样的引用:“因此,C++是ANSI C的超集,因为ANSI C是K&R C的超集,并且就像ISO C++是C++存在的1985的超集一样。”因此,如果C和C++在这方面不同,那就不是有意的,而是无意的。其他所有类似C语言的语言都借用了C语法,但没有那么紧密的联系,这是另一回事。这意味着不应该编译它?@xtofl不应该。数组名没有整体升级。@Pravasi我将还原您的编辑。偷别人的答案是不公平的。