在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++之间有这样的区别。)
发布于 2017-01-18 10:12:11
不同的语言可能会在相同的语法上附加不同的语义。
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中,一元+运算符可以应用于非数字类型,并作为对数字的转换。
发布于 2017-03-22 03:58:06
在我的考虑中:
C++是一种面向对象的语言.因此,每种数据类型都可以被视为“类”。
在C中int是“C的基本数据类型”之一。但在C++中,我们可以将int看作一个类。因此,在C++中,int指针和int数组属于不同的类。在C中,int指针变量存储另一个int变量的地址。int数组的名称而不是该int数组的第一个元素的地址。所以在C中,它们的意思是一样的。
至于一元运算器"+",我理解C++语言为: C++中的每个类都代表一组内容。集合中的每一个东西都有相同的属性。每件事都可以做些手术。当然,这些操作是类的成员函数。C++中的另一个字符是用户可以重载运算符。重载意味着我们可以对不同的类执行相同的操作。例如:一个男人在吃汉堡。我们可以在猫和老鼠之间过载“吃”:猫是吃老鼠。
因此,正如C++标准所指出的:“一元+运算符的操作数应该具有算术、非作用域枚举或指针类型,其结果是参数的值。”--这只是类非作用域枚举和指针类型中的一元操作符+的过载。“和结果是参数的值”->--我猜这就是重点。
https://stackoverflow.com/questions/41716138
复制相似问题