箭头运算符放置 C
Arrow operator placement C
使用此示例结构:
typedef struct
{
uint8_t ary[2];
uint32_t val;
}test_t;
这两个代码片段在功能上是等价的:
截图 1(sizeof 括号内的箭头操作):
int main()
{
printf("Hello World");
printf("\n %d", sizeof(((test_t *)0)->ary));
return 0;
}
Snip 2(括号外的箭头操作):
int main()
{
printf("Hello World");
printf("\n %d", sizeof((test_t *)0)->ary);
return 0;
}
如果 ary 的大小发生变化,两者都会报告正确的值,但是我不明白外部括号示例是如何工作的:
sizeof((test_t *)0) // Using memory address 0 as pointer to test_t. size of pointer should be 4 on 32 bit system
因此剪辑 2 中的外部箭头操作应等同于:
4->ary or *4.ary
那么为什么 snip 2 编译并且 运行 与 snip 1 相同
Expected output: 2
引自N1570 6.5.3 一元运算符:
Syntax
1 unary-expression:
postfix-expression
++ unary-expression
-- unary-expression
unary-operator cast-expression
sizeof unary-expression
sizeof ( type-name )
_Alignof ( type-name )
如您所见,采用表达式的 sizeof
运算符不需要括号。
因此sizeof(((test_t *)0)->ary)
和sizeof((test_t *)0)->ary
都有效。
请注意,printf("\n %d", sizeof(((test_t *)0)->ary));
无效(调用 未定义的行为 ),因为使用了错误的格式说明符。 %d
用于打印 int
。 sizeof
运算符 returns size_t
其格式说明符是 %zu
.
使用此示例结构:
typedef struct
{
uint8_t ary[2];
uint32_t val;
}test_t;
这两个代码片段在功能上是等价的:
截图 1(sizeof 括号内的箭头操作):
int main()
{
printf("Hello World");
printf("\n %d", sizeof(((test_t *)0)->ary));
return 0;
}
Snip 2(括号外的箭头操作):
int main()
{
printf("Hello World");
printf("\n %d", sizeof((test_t *)0)->ary);
return 0;
}
如果 ary 的大小发生变化,两者都会报告正确的值,但是我不明白外部括号示例是如何工作的:
sizeof((test_t *)0) // Using memory address 0 as pointer to test_t. size of pointer should be 4 on 32 bit system
因此剪辑 2 中的外部箭头操作应等同于:
4->ary or *4.ary
那么为什么 snip 2 编译并且 运行 与 snip 1 相同
Expected output: 2
引自N1570 6.5.3 一元运算符:
Syntax 1 unary-expression: postfix-expression ++ unary-expression -- unary-expression unary-operator cast-expression sizeof unary-expression sizeof ( type-name ) _Alignof ( type-name )
如您所见,采用表达式的 sizeof
运算符不需要括号。
因此sizeof(((test_t *)0)->ary)
和sizeof((test_t *)0)->ary
都有效。
请注意,printf("\n %d", sizeof(((test_t *)0)->ary));
无效(调用 未定义的行为 ),因为使用了错误的格式说明符。 %d
用于打印 int
。 sizeof
运算符 returns size_t
其格式说明符是 %zu
.