在C中,一元加运算符称为一元算术运算符,不能应用于指针(C标准6.5.3.3一元算术运算符)。



因此该程序将无法编译

#include <stdio.h>

int main(void)
{
    int a = 10;
    int *pa = &a;

    printf( "%d\n", *+pa );

    return 0;
}

但是,在C++中,一元加运算符可以应用于指针(C++标准5.3.1一元运算符)



并且该程序编译成功。
#include <iostream>

int main()
{
    int a = 10;
    int *pa = &a;

    std::cout << *+pa << std::endl;

    return 0;
}

保持C和C++之间这种差异的原因是什么?

当我回答问题Why size of int pointer is different of size of int array?时出现了问题。我将展示如何在sizeof运算符中将数组转换为指针。

一开始我想写
sizeof( +array )

但是这个表达式在C语言中是无效的。所以我不得不写
sizeof( array + 0 )

我发现C和C++之间有这样的区别。

最佳答案

不同的语言可能会将不同的语义附加到同一语法中。

C和C++是具有共同祖先的不同语言。 C++语义在外观上看似相似,但对于通用语法的某些部分却有所不同。另一个奇怪的情况是:

if (sizeof(char) == sizeof(int)) {
    printf("Hello embedded world\n");
} else {
    if (sizeof('a') == sizeof(char))
        printf("This is C++ code\n");
    if (sizeof('a') == sizeof(int))
        printf("This is C code\n");
}

在使用一元+的情况下,C++扩展C语法的原因可能是允许将某些扩展的数字类型实现为指针,或者仅仅是出于对称性的原因。

正如Jaa-c在评论中提到的那样,+p是一个计算表达式,而p是对p的引用。您提供了另一个示例,其中+可用于强制表达式上下文。问题是,为什么C语言的原始作者不允许在非数字类型上使用一元+?也许是pcc的原始实现的副作用。

请注意,在Javascript中,一元+运算符可以应用于非数字类型,并且可以转换为数字。

关于c++ - 相对于一元算术运算符,C和C++之间存在差异的原因是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41716138/

10-11 16:39