类型转换与化合物赋值运算符一起使用

时间:2018-09-12 07:31:50

标签: c

((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个字节。

1 个答案:

答案 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