Vla*_*cow 7 c c++ pointers unary-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;
}
Run Code Online (Sandbox Code Playgroud)
但是在C++中,一元加运算符可以应用于指针(C++标准,5.3.1一元运算符)
7一元+运算符的操作数应具有算术,无范围枚举或指针类型,结果是参数的值.对整数或枚举操作数执行整体提升.结果的类型是提升的操作数的类型.
这个程序编译成功.
#include <iostream>
int main()
{
int a = 10;
int *pa = &a;
std::cout << *+pa << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
维持C和C++之间差异的原因是什么?
当我回答问题为什么int指针的大小与int数组的大小不同时,问题出现了?.我将展示如何将数组转换为sizeof运算符中的指针.
起初我想写
sizeof( +array )
Run Code Online (Sandbox Code Playgroud)
但是这个表达式在C中是无效的.所以我不得不写
sizeof( array + 0 )
Run Code Online (Sandbox Code Playgroud)
我发现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");
}
Run Code Online (Sandbox Code Playgroud)
C++ 在一元情况下扩展 C 语法的原因+可能是允许将某些扩展数字类型实现为指针,或者仅仅是出于对称性的原因。
正如 Jaa-c 在评论中提到的那样,+p是一个计算表达式,而p是对 的引用p。+您提供了另一个可用于强制表达式上下文的示例。问题是为什么 C 语言的原始作者不允许+非数字类型上的一元?也许是最初实现的副作用pcc。
请注意,在 Javascript 中,一元+运算符可以应用于非数字类型,并作为数字转换进行操作。
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |