从汇编层面看多个赋值语句写在一行, 用','符号分开

在看算法例题时, 发现在一个宏中出现了previous[i] = i-1, next[i] = i+1; 这样的写法

我就想知道他为啥这么写, 为啥不写成如下语句.

previous[i] = i-1;
next[i] = i+1;

难道有什么特别的好处么?


看调试版的反汇编实现

数组内存地址

previous[]数组内存地址 : dword ptr [ebp-2Ch]

next[]数组内存地址 : [ebp-58h]

在一行中用','符号分隔, 进行多个语句的赋值的反汇编分析

50:                previous[i] = i-1, next[i] = i+1;
004010DC 8B 95 24 FF FF FF    mov         edx,dword ptr [i]
004010E2 83 EA 01             sub         edx,1 ; ///< edx = i - 1;
004010E5 8B 85 24 FF FF FF    mov         eax,dword ptr [i] <span style="font-family: Arial, Helvetica, sans-serif;">; ///< (i - 1)放到edx</span>
004010EB 89 54 85 D4          mov         dword ptr [ebp+eax*4-2Ch],edx ; ///< <span style="font-family: Arial, Helvetica, sans-serif;">previous[i] = i-1</span>
004010EF 8B 8D 24 FF FF FF    mov         ecx,dword ptr [i]
004010F5 83 C1 01             add         ecx,1 ; ///< ecx = i + 1
004010F8 8B 95 24 FF FF FF    mov         edx,dword ptr [i]
004010FE 89 4C 95 A8          mov         dword ptr [ebp+edx*4-58h],ecx ; ///< next[i] = i + 1;

用2行单独赋值语句的反汇编分析

51:                previous[i] = i-1;
004010DC 8B 95 24 FF FF FF    mov         edx,dword ptr [i]
004010E2 83 EA 01             sub         edx,1
004010E5 8B 85 24 FF FF FF    mov         eax,dword ptr [i]
004010EB 89 54 85 D4          mov         dword ptr [ebp+eax*4-2Ch],edx
52:                next[i] = i+1;
004010EF 8B 8D 24 FF FF FF    mov         ecx,dword ptr [i]
004010F5 83 C1 01             add         ecx,1
004010F8 8B 95 24 FF FF FF    mov         edx,dword ptr [i]
004010FE 89 4C 95 A8          mov         dword ptr [ebp+edx*4-58h],ecx

可以看出, 两种写法, 生成的汇编代码一样.
那为什么要这么写呢?

2个赋值语句写在一行的代码在一个宏里
// #define   INITIAL(n) { unsigned long i;                      \
//                        for (i = 2; i <= n; i++)              \
//                             previous[i] = i-1, next[i] = i+1;\
//                        previous[2] = next[n] = 0;         \
//                      }
这么做的本意就只有一个原因了, 就是为了在for循环语句下少写一对 {}.

总结

代码是给人看的, 如果编码代码生成结果一样的情况下. 必须写的可维护性高才行.
所以像这样的技巧还是少在工程中用. 
不是每个维护者和学习者都能理解语法层面的奇技淫巧.
我鄙视语法层面的奇技淫巧^_^

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值