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

时间:2016-02-01 14:51:54

标签: c arrays pointers unary-operator

我知道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)但不在C中编译(参见实时演示here。)我的编译器(gcc 4.8.1)在编译时给出了以下错误它作为C程序。

[Error] wrong type argument to unary plus

一元加运算符在这里服务的目的是什么?它到底在做什么?为什么C不允许这样做?

4 个答案:

答案 0 :(得分:7)

section 6.5.3.3 of C99州:

  

1)一元+或 - 运算符的操作数应具有算术类型;   ......

     

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

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

答案 1 :(得分:5)

  

一元加运算符在这里服务的目的是什么?

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

  

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

     

[7]一元+运算符的操作数应具有算术,无范围枚举或指针类型,结果是参数的值。

有时候人们会使用这个操作符来强制"强迫"衰减,即在这种情况下是指针的数组。但它是相当多余的,因为转换是自动发生的。

  

它到底在做什么?为什么C不允许这样做?

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

答案 2 :(得分:0)

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

对于C来说,似乎还没有引入这个概念。

答案 3 :(得分:0)

我只见过这种情况,在一元+运算符已经用C ++等OOP语言重载的情况下使用过。除了可能导致错误,例如指针被意外传递给宏或没有预期的函数之外,它在C中没有目的。

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