我刚刚看到嵌入式c语句(dsPIC33)
sample1 = sample2 = 0;
这意味着什么
sample1 = 0;
sample2 = 0;
他们为什么这样输入?这是好还是坏编码?
Som*_*ude 38
请记住,赋值是从右到左完成的,它们是正常的表达式.所以从编译器的角度来看
sample1 = sample2 = 0;
是相同的
sample1 = (sample2 = 0);
这是一样的
sample2 = 0;
sample1 = sample2;
也就是说,sample2被赋值为零,然后sample1被赋值为sample2.在实践中,就像你猜到的那样将两者分配给零.
从形式上看,两个变量t和u类型T,并U分别
T t;
U u;
分配
t = u = X;
(X某些值在哪里)被解释为
t = (u = X);
并相当于一对独立的任务
u = X;
t = (U) X;
X应该注意,值应该到达变量t"好像"它u首先通过变量,但是没有要求它实际上以这种方式发生.X只需在转移u之前转换为类型t.该值不必先分配给u,然后从中复制u到t.上述两个任务实际上没有排序,可以按任何顺序发生,这意味着
t = (U) X;
u = X;
也是此表达式的有效执行计划.(请注意,这种排序自由特定于C语言,其中rvalue中的赋值结果.在C++赋值中求值为左值,这需要对"链式"赋值进行排序.)
没有更多的背景,没有办法说是一个好的或坏的编程实践.如果两个变量紧密相关(如点x和y坐标),使用"链式"赋值将它们设置为某个常用值实际上是非常好的练习(我甚至会说"推荐练习").但是当变量完全不相关时,将它们混合在一个"链式"赋值中绝对不是一个好主意.特别是如果这些变量具有不同的类型,这可能导致意想不到的后果.
小智 6
我认为没有实际的汇编列表,C语言没有好的答案:)
所以对于一个简单的程序:
int main() {
        int a, b, c, d;
        a = b = c = d = 0;
        return a;
}
我有这个装配(Kubuntu,gcc 4.8.2,x86_64)-O0当然有选项;)
main:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    $0, -16(%rbp)       ; d = 0
        movl    -16(%rbp), %eax     ; 
        movl    %eax, -12(%rbp)     ; c = d
        movl    -12(%rbp), %eax     ;
        movl    %eax, -8(%rbp)      ; b = c
        movl    -8(%rbp), %eax      ;
        movl    %eax, -4(%rbp)      ; a = b
        movl    -4(%rbp), %eax      ;
        popq    %rbp
        ret                         ; return %eax, ie. a
所以gcc 实际上是链接所有的东西.