java i++ 和 ++i 深度解析

来源:互联网 发布:linux rpm文件 编辑:程序博客网 时间:2024/06/16 17:52

转:http://blog.csdn.net/never_cxb/article/details/47359761


目录(?)[+]

  1. i 和 i 都能实现1 顺序不同
  2. i利用了中间缓存变量
  3. 总结

i++ 和 ++i 都能实现+1, 顺序不同

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> TestPlus {    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>;        System.<span class="hljs-keyword">out</span>.println(i++);        <span class="hljs-keyword">int</span> j = <span class="hljs-number">0</span>;        System.<span class="hljs-keyword">out</span>.println(++j);        System.<span class="hljs-keyword">out</span>.println(<span class="hljs-string">"i="</span> + i + <span class="hljs-string">" j="</span> + j);    }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>

输出结果为

<code class="hljs matlab has-numbering"><span class="hljs-number">0</span><span class="hljs-number">1</span><span class="hljs-built_in">i</span>=<span class="hljs-number">1</span> <span class="hljs-built_in">j</span>=<span class="hljs-number">1</span></code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li></ul>

如上所示:

i++ 是执行完后面的语句, 才加1

++i 就先加1, 才执行后面的语句

i++利用了中间缓存变量

如果 i = i++ 会是什么结果呢

<code class="hljs cs has-numbering"><span class="hljs-keyword">public</span> <span class="hljs-keyword">class</span> TestPlus {    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title">main</span>(String[] args) {        <span class="hljs-keyword">int</span> i = <span class="hljs-number">0</span>;        i = i++;        System.<span class="hljs-keyword">out</span>.println(i);        <span class="hljs-keyword">int</span> j = <span class="hljs-number">0</span>;        j = ++j;        System.<span class="hljs-keyword">out</span>.println(j);    }}</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li></ul>

输出为

<code class="hljs  has-numbering">01</code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets_01.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li></ul>

i++ 有中间缓存变量, i = i++ 等价于

<code class="hljs matlab has-numbering">temp = <span class="hljs-built_in">i</span>;<span class="hljs-built_in">i</span> = <span class="hljs-built_in">i</span> + <span class="hljs-number">1</span>;<span class="hljs-built_in">i</span> = temp;</code><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets_01.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li><li>3</li></ul>

所以 i 不变, 依然是0


<code class="hljs vhdl has-numbering">//Warning: The assignment <span class="hljs-keyword">to</span> <span class="hljs-keyword">variable</span> j has no effectj = ++j;</code><ul class="pre-numbering"><li>1</li><li>2</li></ul><div class="save_code tracking-ad" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li><li>2</li></ul>
<code class="hljs matlab has-numbering"><span class="hljs-built_in">j</span> = ++<span class="hljs-built_in">j</span> 相当于 <span class="hljs-built_in">j</span> = <span class="hljs-built_in">j</span> = <span class="hljs-built_in">j</span> + <span class="hljs-number">1</span></code><ul class="pre-numbering"><li>1</li></ul><div class="save_code tracking-ad" style="display: none;" data-mod="popu_249"><a><img src="http://static.blog.csdn.net/images/save_snippets_01.png" alt="" /></a></div><ul class="pre-numbering"><li>1</li></ul>

所以编译器警告, 语句的赋值没有作用

总结

++i 没有中间缓存变量, 理论上比 i++ 更加高效


0 0
原创粉丝点击