((unsigned long long *)P)[0] += B;
以上声明是否等同于:((unsigned long long *)P)[0] = ((unsigned long long *)P)[0] + B;
?
P定义为:int P[5];
B定义为:unsigned long long B;
int的大小为2个字节。
答案 0 :(得分:1)
它们表示相同,并且组装(对于x86-64系统)也相同。您可以在Godbolt编译器浏览器here中进行检查,该浏览器显示了两个语句的汇编。
int P[5];
unsigned long long B;
void check1() {
((unsigned long long *)P)[0] += B;
}
void check2() {
((unsigned long long *)P)[0] = ((unsigned long long *)P)[0] + B;
}
check1
的组装:
check1:
pushq %rbp
movq %rsp, %rbp
movl $P, %eax
movq (%rax), %rdx
movq B(%rip), %rax
movl $P, %ecx
addq %rdx, %rax
movq %rax, (%rcx)
nop
popq %rbp
ret
check2
的组装:
check2:
pushq %rbp
movq %rsp, %rbp
movl $P, %eax
movq (%rax), %rdx
movq B(%rip), %rax
movl $P, %ecx
addq %rdx, %rax
movq %rax, (%rcx)
nop
popq %rbp
ret