1 The operand of the unary + or – operator shall have arithmetic
type; of the ~ operator,integer type; of the ! operator,scalar
type.@H_502_8@
因此这个程序不会编译@H_502_8@
#include <stdio.h> int main(void) { int a = 10; int *pa = &a; printf( "%d\n",*+pa ); return 0; }
但是在C中,一元加运算符可以应用于指针(C标准,5.3.1一元运算符)@H_502_8@
7 The operand of the unary + operator shall have arithmetic,unscoped
enumeration,or pointer type and the result is the value of the
argument. Integral promotion is performed on integral or enumeration
operands. The type of the result is the type of the promoted operand.@H_502_8@
这个程序编译成功.@H_502_8@
#include <iostream> int main() { int a = 10; int *pa = &a; std::cout << *+pa << std::endl; return 0; }
保持C和C之间差异的原因是什么?@H_502_8@
当我回答问题Why size of int pointer is different of size of int array?时出现了这个问题.我将展示如何将数组转换为sizeof运算符中的指针.@H_502_8@
起初我想写@H_502_8@
sizeof( +array )
但是这个表达式在C中是无效的.所以我不得不写@H_502_8@
sizeof( array + 0 )
我发现C和C之间存在这样的差异.:)@H_502_8@
解决方法
C和C是具有共同祖先的不同语言. C语义看起来看似相似,但对于常见语法的某些部分略有不同.另一个奇怪的例子是:@H_502_8@
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语法的原因可能是允许将某些扩展数值类型实现为指针,或者仅仅出于对称的原因.@H_502_8@
正如Jaa-c在评论中提到的那样,p是计算表达式,而p是对p的引用.您提供了另一个示例,可用于强制表达式上下文.问题是为什么C语言的原作者不允许非数字类型的一元?也许是pcc原始实现的副作用.@H_502_8@
请注意,在Javascript中,一元运算符可以应用于非数字类型,并作为数字转换运行.@H_502_8@