我如何确定我是否过度加括号?
How can I determine if I'm overparenthesizing?
我目前正在尝试避免使用 C 中的指针算法来编写模拟器。
通常,如果您将 1
添加到 C 中的指针,则会添加指向对象的大小。但是,我正在尝试使用位和字节,所以这是不希望的。
我想知道我是否在这个例子中使用了太多括号:
*(int16_t *)(((intptr_t)bc)+sp)
如果不是,那么是不是相当于这个? :
*(int16_t *)((intptr_t)bc+sp)
sp
是我的模拟器的页面对齐堆栈地址(通过 mmap
获得,没有设置 MAP_FIXED
)。它是 intptr_t
类型。
bc
是 int16_t *
类型的名称。它是指向两个 int8_t
的组合的指针。
你问的是运算符优先级。可以找到完整列表 here.
“+”操作发生在类型转换操作之后。因此,您不需要第二层括号,因为 intptr_t
转换首先应用于 bc
,然后将结果添加到 sp
.
(((intptr_t)bc)+sp)
等同于((intptr_t)bc+sp)
。
但是整个 "avoid the pointer arithmetic" 方法不可移植。
至少有 3 个问题:
指针,转换为整数,当然不能保持所需的数学属性。
// possible outcome
uint16_t x[2];
printf("%llx\n", (unsigned long long) (intptr_t) &x[0]); // --> abcd0000
printf("%llx\n", (unsigned long long) (intptr_t) &x[1]); // --> abcd0010
作为整数的差异可能是 16,而不是希望的 2——即使 2 的差异更为常见。
此外,对于 *(int16_t *)((intptr_t)bc+sp)
,如果 sp
是奇数,(int16_t *)
可能会由于对齐限制而失败。
反锯齿问题也会发生。
尽管整数有各种缺陷,但这种避免指针运算的方法存在各种缺陷 - 祝你好运。
我目前正在尝试避免使用 C 中的指针算法来编写模拟器。
通常,如果您将 1
添加到 C 中的指针,则会添加指向对象的大小。但是,我正在尝试使用位和字节,所以这是不希望的。
我想知道我是否在这个例子中使用了太多括号:
*(int16_t *)(((intptr_t)bc)+sp)
如果不是,那么是不是相当于这个? :
*(int16_t *)((intptr_t)bc+sp)
sp
是我的模拟器的页面对齐堆栈地址(通过 mmap
获得,没有设置 MAP_FIXED
)。它是 intptr_t
类型。
bc
是 int16_t *
类型的名称。它是指向两个 int8_t
的组合的指针。
你问的是运算符优先级。可以找到完整列表 here.
“+”操作发生在类型转换操作之后。因此,您不需要第二层括号,因为 intptr_t
转换首先应用于 bc
,然后将结果添加到 sp
.
(((intptr_t)bc)+sp)
等同于((intptr_t)bc+sp)
。
但是整个 "avoid the pointer arithmetic" 方法不可移植。
至少有 3 个问题:
指针,转换为整数,当然不能保持所需的数学属性。
// possible outcome uint16_t x[2]; printf("%llx\n", (unsigned long long) (intptr_t) &x[0]); // --> abcd0000 printf("%llx\n", (unsigned long long) (intptr_t) &x[1]); // --> abcd0010
作为整数的差异可能是 16,而不是希望的 2——即使 2 的差异更为常见。
此外,对于
*(int16_t *)((intptr_t)bc+sp)
,如果sp
是奇数,(int16_t *)
可能会由于对齐限制而失败。反锯齿问题也会发生。
尽管整数有各种缺陷,但这种避免指针运算的方法存在各种缺陷 - 祝你好运。