佳音的博客

2010/10/15

自增运算php & c

Filed under: c语言学习,php,Uncategorized — 佳音 @ 4:18 下午

以前面试的时候老有人问  ++i 和 i++ 的问题, 每每心里都在暗暗想…,
1、这俩东西功能不一样。

2、 写代码的时候多放些注意力在别的地方比在这个地方纠结强。
我总认为, 可读性和扩展性好的代码  比 一堆 又烂又快的代码好。

3、不免俗的研究了一下。

对于C

  1. #include "stdio.h"
  2.  
  3. int main(int argc, char *argv[]) {
  4.     int i = 0;
  5.  
  6.     int a = 0;
  7.     int b = 0;
  8.  
  9.     a = i++;
  10.     b=  ++i;
  11.  
  12.     i++;
  13.     ++i;
  14.  
  15.     printf("%d",a);
  16.     printf("%d",b);
  17. }

汇编后

  1.         .file   "test.c"
  2.         .section        .rodata
  3. .LC0:
  4.         .string "%d"
  5.         .text
  6. .globl main
  7.         .type   main, @function
  8. main:
  9.         pushl   %ebp
  10.         movl    %esp, %ebp
  11.         andl    $-16, %esp
  12.         subl    $32, %esp
  13.         movl    $0, 28(%esp)
  14.         movl    $0, 24(%esp)
  15.         movl    $0, 20(%esp)
  16.         movl    28(%esp), %eax
  17.         movl    %eax, 24(%esp)
  18.         addl    $1, 28(%esp)
  19.         addl    $1, 28(%esp)
  20.         movl    28(%esp), %eax
  21.         movl    %eax, 20(%esp)
  22.         addl    $1, 28(%esp)
  23.         addl    $1, 28(%esp)
  24.         movl    $.LC0, %eax
  25.         movl    24(%esp), %edx
  26.         movl    %edx, 4(%esp)
  27.         movl    %eax, (%esp)
  28.         call    printf
  29.         movl    $.LC0, %eax
  30.         movl    20(%esp), %edx
  31.         movl    %edx, 4(%esp)
  32.         movl    %eax, (%esp)
  33.         call    printf
  34.         leave
  35.         ret
  36.         .size   main, .-main
  37.         .ident  "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
  38.         .section        .note.GNU-stack,"",@progbits

可以看出没有赋值操作的 自增运算 不管是 ++i 还是i++ 都会被会变成一条相同的汇编(addl $1, 28(%esp))
如果有赋值操作的时候 汇编的条数是一样的 只是 几条语句的顺序不一样
所以C中这两种格式区别仅在于生成的值, 所以在仅使用它们的副作用时, 二者 完全一样,

http://c-faq-chn.sourceforge.net/ccfaq/node46.htm

但是 C++同学的表现是不一样的有兴趣的同学google一下,

悲剧 刚才写的一段代码丢了
简单说下php同学吧
有兴趣的通许参阅一下php源码 大概在这个文件里zend_compile.c
stackoverflow上有一些简单的说明:

http://stackoverflow.com/questions/1756015/whats-the-difference-between-i-and-i-in-php

原文有一段
:For further clarification, post-incrementation in PHP has been documented as storing a temporary variable which attributes to this 10% overhead vs. pre-incrementation.

是说 post-incrementation i++ 比pre-incrementation ++i 花费多10% 来存储一个临时变量。

2010/10/06

http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-1/

Filed under: Uncategorized — 佳音 @ 10:24 下午

http://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-1/

Powered by 00RZ