繁体   English   中英

相对于一元算术运算符+,C和C ++之间存在差异的原因是什么

[英]What is the reason for the existent difference between C and C++ relative to the unary arithmetic operator +

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

1一元+或 - 运算符的操作数应具有算术类型 ; 〜运算符,整数类型; 的! 运算符,标量类型。

因此这个程序不会编译

#include <stdio.h>

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

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

    return 0;
}

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

7一元+运算符的操作数应具有算术,无范围枚举或指针类型 ,结果是参数的值。 对整数或枚举操作数执行整体提升。 结果的类型是提升的操作数的类型。

这个程序编译成功。

#include <iostream>

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

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

    return 0;
}

维持C和C ++之间差异的原因是什么?


当我回答问题为什么int指针的大小与int数组的大小不同时,问题出现了 我将展示如何将数组转换为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 int中是“C的基本数据类型”之一。 但是在C ++中我们可以将int视为一个类。 因此,在C ++中int指针和int数组属于不同的类。 在C中,一个int指针变量存储了另一个int变量的地址。 int数组的名称,而不是该int数组的第一个元素的地址。 所以在C中它们具有相同的含义。

至于一元opreator“+”,我理解C ++语言:每个C ++语言代表一组东西。 集合中的每个东西都具有相同的属性。 并且可以对每个东西进行一些操作。 当然,这些操作是类的成员函数。 C ++中的另一个字符是用户可以重载运算符。 重载意味着我们可以在不同的类上执行相同的操作。 例如:一个男人在吃汉堡。 我们可以超载猫和老鼠之间的“吃”动作:一只猫正在吃一只老鼠。

因此,正如C ++标准所说:“ 一元+运算符的操作数应具有算术,无范围枚举或指针类型,结果是参数的值。 ”这只是一元uncoped枚举指针中一元运算符+的重载类型 结果是争论的价值 ” - >我想这就是重点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM