这相当于C中的复合赋值吗?

时间:2018-02-03 13:59:51

标签: c c11

给出以下表达式,其中A和B代表任意操作数(例如局部或全局变量,函数返回的值等)

A -= B;

我们是否可以在不改变含义的情况下将其替换为以下内容?

(type of A)* temp = &(A);
(*temp) = (*temp) - B;
return (*temp); // implicit

似乎有效,只要A的类型不是易失性/原子。

简单的测试用例:

extern int f (void);
return *f() -= 5;
// is equivalent to
(int)* temp = &(*f()); // single call to function
(*temp) = (*temp) - B;
return (*temp);

另:

extern int * p;
return p -= 5;
// is equivalent to
(int*)* temp = &(p);
(*temp) = (*temp) - 5; // pointer arithmetic works fine
return (*temp);

2 个答案:

答案 0 :(得分:1)

没有

extern volatile int i;
extern volatile int j;

int f(void) {
    return i += j;
}

int g(void) {
    volatile int *ip = &i;
    *ip = *ip + j;
    return *ip;
}

编译到

f:
    movl    j(%rip), %edx
    movl    i(%rip), %eax
    addl    %edx, %eax
    movl    %eax, i(%rip)
    ret

g:
    movl    i(%rip), %eax
    movl    j(%rip), %edx
    addl    %edx, %eax
    movl    %eax, i(%rip)
    movl    i(%rip), %eax
    ret

i的负载数量不同会导致不同的行为,例如,如果i用于内存映射硬件IO。

答案 1 :(得分:0)

没有必要让它变得复杂,它会破坏可读性,也就是这段代码:

(type of A)* temp = &(A);
(*temp) = (*temp) - B;
return (*temp); // implicit

将由编译器优化。