在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 ++之间保持这种差异的原因是什么?
当我回答问题Why size of int pointer is different of size of int array?时出现了问题。我将展示如何将数组转换为sizeof
运算符中的指针。
起初我想写
sizeof( +array )
但是这个表达式在C中无效。所以我不得不写
sizeof( array + 0 )
我发现C和C ++之间存在这样的差异:。)
答案 0 :(得分:1)
不同的语言可能会将不同的语义附加到相同的语法中。
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中,一元+
运算符可以应用于非数字类型,并作为转换为数字。
答案 1 :(得分:-1)
这并不能解决您提出的问题,但是对于您想要显示转换的问题,我会使用:
sizeof(&array[0])
实际上与(array + 0)相同,但更清楚地表示&#34;指向第一个元素&#34;的指针。并显示(如果数组在64位机器上的大小不是1),它将与sizeof(int)相同,并且
sizeof(array)
不一样。
答案 2 :(得分:-2)
在我的考虑中:
C ++是一种面向对象语言。因此,每种数据类型都可以视为&#34; Class&#34;。
在C int中是&#34; C&#34;的基本数据类型之一。但是在C ++中我们可以将int视为一个类。因此,在C ++中int指针和int数组属于不同的类。在C中,int指针变量存储了另一个int变量的地址。 int array的名称,而不是该int数组的第一个元素的地址。所以在C语言中它们具有相同的含义。
对于一元opreator&#34; +&#34;,我理解C ++语言为:每个C ++语言代表一组东西。集合中的每个东西都具有相同的属性。并且可以对每个东西进行一些操作。当然,这些操作是类的成员函数。 C ++中的另一个字符是用户可以重载运算符。重载意味着我们可以在不同的类上执行相同的操作。例如:一个男人在吃汉堡。我们可以超负荷行动&#34;吃&#34;猫与老鼠之间:一只猫正在吃一只老鼠。
因此,正如C ++标准所说:&#34; 一元+运算符的操作数应具有算术,无范围枚举或指针类型,结果是参数的值。&# 34;这只是Class unscoped枚举和指针类型中一元运算符+的重载。 &#34; 结果是争论的价值&#34; - &gt;我想这就是重点。