在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/