??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲男人的天堂久久精品,亚洲美女在线国产,自拍日韩亚洲一区在线http://m.tkk7.com/renyangok/回归blogjavazh-cnMon, 12 May 2025 06:48:43 GMTMon, 12 May 2025 06:48:43 GMT60java中到底传D是引?/title><link>http://m.tkk7.com/renyangok/archive/2008/09/12/228524.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Fri, 12 Sep 2008 02:25:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2008/09/12/228524.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/228524.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2008/09/12/228524.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/228524.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/228524.html</trackback:ping><description><![CDATA[JAVA中的传递都是g递吗Q有没有引用传递呢Q?<br /> <br /> 在回{这两个问题前,让我们首先来看一D代码:(x) <br /> <div id="6111616" class="dp-highlighter"> <div id="1611666" class="bar"> <div id="6611661" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://zangweiren.javaeye.com/images/icon_copy.gif" /></a></div> </div> <ol class="dp-j"> <li><span><span id="6661111" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="1666116" class="keyword"><strong><font color="#7f0055">class</font></strong></span><span> ParamTest {   </span></span></li> <li><span>    </span><span id="1616111" class="comment"><font color="#008200">// 初始gؓ(f)0 </font></span><span>  </span></li> <li><span>    </span><span id="1661116" class="keyword"><strong><font color="#7f0055">protected</font></strong></span><span> </span><span id="1666116" class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> num = </span><span id="1611616" class="number"><font color="#c00000">0</font></span><span>;   </span></li> <li><span>  </span></li> <li><span>    </span><span id="6661166" class="comment"><font color="#008200">// 为方法参数重新赋?</font></span><span>  </span></li> <li><span>    </span><span id="1666661" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="6116661" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(</span><span id="1666661" class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> i) {   </span></li> <li><span>         i = </span><span id="6616166" class="number"><font color="#c00000">5</font></span><span>;   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="6666166" class="comment"><font color="#008200">// 为方法参数重新赋?</font></span><span>  </span></li> <li><span>    </span><span id="6666616" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="1666116" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(ParamTest t) {   </span></li> <li><span>         ParamTest tmp = </span><span id="6116666" class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ParamTest();   </span></li> <li><span>         tmp.num = </span><span id="6166666" class="number"><font color="#c00000">9</font></span><span>;   </span></li> <li><span>         t = tmp;   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="1666161" class="comment"><font color="#008200">// 改变Ҏ(gu)参数的?</font></span><span>  </span></li> <li><span>    </span><span id="1666161" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="6116111" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> add(</span><span id="6616661" class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> i) {   </span></li> <li><span>         i += </span><span id="6661161" class="number"><font color="#c00000">10</font></span><span>;   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="6611616" class="comment"><font color="#008200">// 改变Ҏ(gu)参数属性的?</font></span><span>  </span></li> <li><span>    </span><span id="6166616" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="1611611" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> add(ParamTest pt) {   </span></li> <li><span>         pt.num += </span><span id="1166611" class="number"><font color="#c00000">20</font></span><span>;   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="1666116" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="6616616" class="keyword"><strong><font color="#7f0055">static</font></strong></span><span> </span><span id="6161661" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> main(String[] args) {   </span></li> <li><span>         ParamTest t = </span><span id="6661611" class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ParamTest();   </span></li> <li><span>  </span></li> <li><span>         System.out.println(</span><span id="6616166" class="string"><font color="#0000ff">"参数--基本cd"</font></span><span>);   </span></li> <li><span>         System.out.println(</span><span id="1116661" class="string"><font color="#0000ff">"原有的|(x)"</font></span><span> + t.num);   </span></li> <li><span>        </span><span id="6666661" class="comment"><font color="#008200">// 为基本类型参数重新赋?</font></span><span>  </span></li> <li><span>         t.change(t.num);   </span></li> <li><span>         System.out.println(</span><span id="1166111" class="string"><font color="#0000ff">"赋g后:(x)"</font></span><span> + t.num);   </span></li> <li><span>        </span><span id="1666116" class="comment"><font color="#008200">// 为引用型参数重新赋?</font></span><span>  </span></li> <li><span>         t.change(t);   </span></li> <li><span>         System.out.println(</span><span id="6161666" class="string"><font color="#0000ff">"q算之后Q?</font></span><span> + t.num);   </span></li> <li><span>  </span></li> <li><span>         System.out.println();   </span></li> <li><span>  </span></li> <li><span>         t = </span><span id="6616666" class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> ParamTest();   </span></li> <li><span>         System.out.println(</span><span id="1666666" class="string"><font color="#0000ff">"参数--引用cd"</font></span><span>);   </span></li> <li><span>         System.out.println(</span><span id="6116616" class="string"><font color="#0000ff">"原有的|(x)"</font></span><span> + t.num);   </span></li> <li><span>        </span><span id="6161166" class="comment"><font color="#008200">// 改变基本cd参数的?</font></span><span>  </span></li> <li><span>         t.add(t.num);   </span></li> <li><span>         System.out.println(</span><span id="6166161" class="string"><font color="#0000ff">"赋引用后Q?</font></span><span> + t.num);   </span></li> <li><span>        </span><span id="6666616" class="comment"><font color="#008200">// 改变引用cd参数所指向对象的属性?</font></span><span>  </span></li> <li><span>         t.add(t);   </span></li> <li><span>         System.out.println(</span><span id="1661166" class="string"><font color="#0000ff">"改属性后Q?</font></span><span> + t.num);   </span></li> <li><span>     }   </span></li> <li><span>}  </span></li> </ol> </div> <pre class="java" style="display: none;" name="code">public class ParamTest { // 初始gؓ(f)0 protected int num = 0; // 为方法参数重新赋? public void change(int i) { i = 5; } // 为方法参数重新赋? public void change(ParamTest t) { ParamTest tmp = new ParamTest(); tmp.num = 9; t = tmp; } // 改变Ҏ(gu)参数的? public void add(int i) { i += 10; } // 改变Ҏ(gu)参数属性的? public void add(ParamTest pt) { pt.num += 20; } public static void main(String[] args) { ParamTest t = new ParamTest(); System.out.println("参数--基本cd"); System.out.println("原有的|(x)" + t.num); // 为基本类型参数重新赋? t.change(t.num); System.out.println("赋g后:(x)" + t.num); // 为引用型参数重新赋? t.change(t); System.out.println("q算之后Q? + t.num); System.out.println(); t = new ParamTest(); System.out.println("参数--引用cd"); System.out.println("原有的|(x)" + t.num); // 改变基本cd参数的? t.add(t.num); System.out.println("赋引用后Q? + t.num); // 改变引用cd参数所指向对象的属性? t.add(t); System.out.println("改属性后Q? + t.num); } }</pre> <br /> q段代码的运行结果如下:(x) <br /> <ol> <li>参数--基本cd</li> <li>原有的|(x)0</li> <li>赋g后:(x)0</li> <li>q算之后Q?</li> <li> <br /> </li> <li>参数--引用cd</li> <li>原有的|(x)0</li> <li>赋引用后Q?</li> <li>改属性后Q?0</li> </ol> <br /> 从上面这个直观的l果中我们很Ҏ(gu)得出如下l论Q?<br /> <ol> <li>对于基本cdQ在Ҏ(gu)体内Ҏ(gu)法参数进行重新赋|q不?x)改变原有变量的倹{?/li> <li>对于引用cdQ在Ҏ(gu)体内Ҏ(gu)法参数进行重新赋予引用,q不?x)改变原有变量所持有的引用?/li> <li>Ҏ(gu)体内对参数进行运,不媄(jing)响原有变量的倹{?/li> <li>Ҏ(gu)体内对参数所指向对象的属性进行运,改变原有变量所指向对象的属性倹{?/li> </ol> <br /> 上面ȝ出来的不q是我们所看到的表面现象。那么,Z么会(x)出现q样的现象呢Q这p说到g递和引用传递的概念?jin)。这个问题向来是颇有争议的?<br /> <br /> 大家都知道,在JAVA中变量有以下两种Q?<br /> <ol> <li>基本cd变量Q包括char、byte、short、int、long、float、double、boolean?/li> <li>引用cd变量Q包括类、接口、数l(基本cd数组和对象数l)(j)?/li> </ol> <br /> 当基本类型的变量被当作参C递给Ҏ(gu)ӞJAVA虚拟机所做的工作是把q个值拷贝了(jin)一份,然后把拷贝后的g递到?jin)方法的内部。因此在上面的例子中Q我们回头来看看q个Ҏ(gu)Q?<br /> <div id="6666616" class="dp-highlighter"> <div id="6616616" class="bar"> <div id="6661666" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://zangweiren.javaeye.com/images/icon_copy.gif" /></a></div> </div> <ol class="dp-j"> <li><span><span id="1661116" class="comment"><font color="#008200">// 为方法参数重新赋?</font></span><span>  </span></span></li> <li><span id="6661166" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="1616661" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(</span><span id="6661111" class="keyword"><strong><font color="#7f0055">int</font></strong></span><span> i) {   </span></li> <li><span>     i = </span><span id="6661611" class="number"><font color="#c00000">5</font></span><span>;   </span></li> <li><span>}  </span></li> </ol> </div> <pre class="java" style="display: none;" name="code">// 为方法参数重新赋? public void change(int i) { i = 5; }</pre> <br /> 在这个方法被调用Ӟ变量i和ParamTest型对象t的属性numh相同的|却是两个不同变量。变量i是由JAVA虚拟机创建的作用域在 change(int i)Ҏ(gu)内的局部变量,在这个方法执行完毕后Q它的生命周期就l束?jin)。在JAVA虚拟ZQ它们是以类似如下的方式存储的:(x) <br /> <div style="text-align: center;"><img src="http://zangweiren.javaeye.com/upload/picture/pic/17754/bf858157-cd1b-3e9e-9fd1-374906bfd90f.jpg" alt="" /></div> <br /> 很明显,在基本类型被作ؓ(f)参数传递给方式Ӟ是g递,在整个过E中Ҏ(gu)没有牉|到引用这个概c(din)这也是大家所公认的。对于布?yu)(dng)型变量当然也是如此Q请看下面的例子Q?<br /> <div id="1116111" class="dp-highlighter"> <div id="1616666" class="bar"> <div id="6661661" class="tools">Java代码 <a title="复制代码" ><img alt="复制代码" src="http://zangweiren.javaeye.com/images/icon_copy.gif" /></a></div> </div> <ol class="dp-j"> <li><span><span id="6166666" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="1116611" class="keyword"><strong><font color="#7f0055">class</font></strong></span><span> BooleanTest {   </span></span></li> <li><span>    </span><span id="1616116" class="comment"><font color="#008200">// 布尔型?</font></span><span>  </span></li> <li><span>    </span><span id="1611111" class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span> bool = </span><span id="1611616" class="keyword"><strong><font color="#7f0055">true</font></strong></span><span>;   </span></li> <li><span>  </span></li> <li><span>    </span><span id="6161616" class="comment"><font color="#008200">// 为布?yu)(dng)型参数重新赋?</font></span><span>  </span></li> <li><span>    </span><span id="6616161" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="1111611" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> change(</span><span id="6666661" class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span> b) {   </span></li> <li><span>         b = </span><span id="6616616" class="keyword"><strong><font color="#7f0055">false</font></strong></span><span>;   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="6111661" class="comment"><font color="#008200">// 对布?yu)(dng)型参数q行q算 </font></span><span>  </span></li> <li><span>    </span><span id="6161666" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="6166161" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> calculate(</span><span id="6111116" class="keyword"><strong><font color="#7f0055">boolean</font></strong></span><span> b) {   </span></li> <li><span>         b = b && </span><span id="6666661" class="keyword"><strong><font color="#7f0055">false</font></strong></span><span>;   </span></li> <li><span>        </span><span id="6666116" class="comment"><font color="#008200">// Z(jin)方便Ҏ(gu)Q将q算l果输出 </font></span><span>  </span></li> <li><span>         System.out.println(</span><span id="1616616" class="string"><font color="#0000ff">"bq算后的|(x)"</font></span><span> + b);   </span></li> <li><span>     }   </span></li> <li><span>  </span></li> <li><span>    </span><span id="6616616" class="keyword"><strong><font color="#7f0055">public</font></strong></span><span> </span><span id="1666111" class="keyword"><strong><font color="#7f0055">static</font></strong></span><span> </span><span id="6611111" class="keyword"><strong><font color="#7f0055">void</font></strong></span><span> main(String[] args) {   </span></li> <li><span>         BooleanTest t = </span><span id="6616166" class="keyword"><strong><font color="#7f0055">new</font></strong></span><span> BooleanTest();   </span></li> <li><span>  </span></li> <li><span>         System.out.println(</span><span id="6166161" class="string"><font color="#0000ff">"参数--布尔?</font></span><span>);   </span></li> <li><span>         System.out.println(</span><span id="6166616" class="string"><font color="#0000ff">"原有的|(x)"</font></span><span> + t.bool);   </span></li> <li><span>        </span><span id="6616666" class="comment"><font color="#008200">// 为布?yu)(dng)型参数重新赋?</font></span><span>  </span></li> <li><span>         t.change(t.bool);   </span></li> <li><span>         System.out.println(</span><span id="6611666" class="string"><font color="#0000ff">"赋g后:(x)"</font></span><span> + t.bool);   </span></li> <li><span>  </span></li> <li><span>        </span><span id="6616161" class="comment"><font color="#008200">// 改变布尔型参数的?</font></span><span>  </span></li> <li><span>         t.calculate(t.bool);   </span></li> <li><span>         System.out.println(</span><span id="6166161" class="string"><font color="#0000ff">"q算之后Q?</font></span><span> + t.bool);   </span></li> <li><span>     }   </span></li> <li><span>}  </span></li> </ol> </div> <pre class="java" style="display: none;" name="code">public class BooleanTest { // 布尔型? boolean bool = true; // 为布?yu)(dng)型参数重新赋? public void change(boolean b) { b = false; } // 对布?yu)(dng)型参数q行q算 public void calculate(boolean b) { b = b && false; // Z(jin)方便Ҏ(gu)Q将q算l果输出 System.out.println("bq算后的|(x)" + b); } public static void main(String[] args) { BooleanTest t = new BooleanTest(); System.out.println("参数--布尔?); System.out.println("原有的|(x)" + t.bool); // 为布?yu)(dng)型参数重新赋? t.change(t.bool); System.out.println("赋g后:(x)" + t.bool); // 改变布尔型参数的? t.calculate(t.bool); System.out.println("q算之后Q? + t.bool); } }</pre> <br /> 输出l果如下Q?<br /> <ol> <li>参数--布尔?/li> <li>原有的|(x)true</li> <li>赋g后:(x)true</li> <li>bq算后的|(x)false</li> <li>q算之后Qtrue</li> </ol> <br /> 那么当引用型变量被当作参C递给Ҏ(gu)时JAVA虚拟机又是怎样处理的呢Q同P它会(x)拯一份这个变量所持有的引用,然后把它传递给JAVA虚拟Zؓ(f)Ҏ(gu) 创徏的局部变量,从而这两个变量指向?jin)同一个对象。在首所丄CZ中,ParamTestcd变量t和局部变量pt在JAVA虚拟Z是以如下的方式存 储的Q?<br /> <div style="text-align: center;"><img src="http://zangweiren.javaeye.com/upload/picture/pic/17756/3c3c237f-bd06-3e7a-a0d9-a2317754b560.jpg" alt="" /></div> <br /> 有一U说法是当一个对象或引用cd变量被当作参C递时Q也是g递,q个值就是对象的引用Q因此JAVA中只有g递,没有引用传递。还有一U说法是? 用可以看作是对象的别名,当对象被当作参数传递给Ҏ(gu)Ӟ传递的是对象的引用Q因此是引用传递。这两种观点各有支持者,但是前一U观点被l大多数人所? 受,其中有《Core Java》一书的作者,以及(qing)JAVA的创造者James GoslingQ而《Thinking in Java》一书的作者Bruce Eckel则站在了(jin)中立的立Z?<br /> <br /> 我个为g递中的值指的是基本cd的数|即对于布尔型,虽然它的表现形式为true和falseQ但是在栈中Q它仍然是以数值Ş式保存的Q即0? CfalseQ其它数DCtrue。而引用是我们用来操作对象的工P它包含了(jin)对象在堆中保存地址的信息。即使在被作为参C递给Ҏ(gu)Ӟ实际上传递的 是它的拷贝,但那仍是引用。因此,用引用传递来区别与g递,概念上更加清晰?<br /> <br /> 最后我们得出如下的l论Q?<br /> <ol> <li>基本cd和基本类型变量被当作参数传递给Ҏ(gu)Ӟ是g递。在Ҏ(gu)实体中,无法l原变量重新赋|也无法改变它的倹{?/li> <li>对象和引用型变量被当作参C递给Ҏ(gu)Ӟ在方法实体中Q无法给原变量重新赋|但是可以改变它所指向对象的属性。至于到底它是g递还是引用传递,qƈ不重要,重要的是我们要清楚当一个引用被作ؓ(f)参数传递给一个方法时Q在q个Ҏ(gu)体内?x)发生什么?/li> </ol> <p>什么叫引用?只因个变量的值和其它的不一? <br /> <br /> <br /> 首先理解:都是变量 <br /> int i; <br /> ArrayList b; <br /> i和b都是变量. <br /> 但i是基本变?也叫原始变量. <br /> 其它的就叫引用变?因ؓ(f)它的值是一个内存地址?引用对象?但记?它们都是有一个值的!i是一个数?而b是一个内存地址?单的说是一个十六进 制的?.除了(jin)基本变量之外的变量都是引用变?Vector a;q里的a也是一个变?它也是有值的,它的值是一个十六进制的? <br /> <br /> 变量的赋? <br /> int i=10; <br /> int j=i; <br /> //q里把i的?0l了(jin)j,所以j的g?0 <br /> <br /> ArrayList b=new ArrayList(); <br /> ArrayList c=b; <br /> //首先,b是一个引用变?它的"?:是一个内存地址?!! new ArrayList()要分配一D内存保存它?怎么h到这D内?那就是通过b里的g(jin).b的值就是new ArrayList()所占内存的首地址.然后c也是一个引用变?它的?地址?和b是一L(fng).也就是new ArrayList()所占内存的首地址.所以当通过b或者cq行操作?它们都是操作同一个对象的. <br /> <br /> 在方法调用的时?Ҏ(gu)的参数实际也是一个变?如果是基本类型变量的时?假设有方法method(int aa); <br /> int j=10; <br /> method(j); <br /> q里?int aa实际也是定义?jin)一个变?调用的时候把j的?10也给?jin)aa.所以aa也是10,改变?jin)aa的值ƈ不会(x)改变j的? <br /> <br /> 如果是引用变量的时?假设有方法methodA(ArrayList aa); <br /> ArrayList b = new ArrayList(); <br /> methodA(b); <br /> //Ҏ(gu)定义?jin)变量aa,调用的时候把b的?地址?!!!!)l了(jin)aa,所以aa与b有一L(fng)?地址?!!!),在方法里通过aaL作的时?b所引用的对象也p改变?因ؓ(f)它们引用同一个对? <br /> <br /> U?a = new 银行帐户();//开一个银行帐?q回一个卡L(fng)?写在你的Ua里边. <br /> <br /> 用一张纸(引用变量),把你的银行卡号写在上?然后调用我的时?我用另外一张纸(引用变量---Ҏ(gu)的Ş?,把你的号码抄q来.然后我通过q个卡号,d银行扑ֈ你的帐号,l你存点? <br /> <br /> 然后你用你的U?引用变量)上的卡号 <没变,q是那个卡号>再去查询银行帐号的时候就?x)发C(jin)多了(jin)一些钱?....</p> <p>说说我对g递和引用传递的看法Q?br /> 首先我认为,大家对Java传递参数的行ؓ(f)是清楚的Q这个争论只是一个语义上的争论?br /> 也就是我们是否需要区分g递和应用传递呢Q或者说q样的区分有没有意义Q是否合理?<br /> <br /> 博主认ؓ(f)存在引用传递的关键点在于,传递的对象地址|本质上它是一个引用,无论它是否被copyq?br /> 认ؓ(f)只有g递的关键点在于,传递的对象地址|它是一个值的copyQ这个g表的意义无所谓?br /> <br /> 引用是c++里的概念Q由于java跟c++是有一定关pȝQ这里把引用q移q来Q如果合理未不可?br /> c++中关于引用的解释一般喜Ƣ说是看?#8220;别名”Q我查了(jin)几本书,大部分提到引用ƈ不会(x)分配内存I间Q也有一本书提到Q某些编译器?x)分配存储空间来存储被引用对象的地址?br /> 那么q是回到语义上来Qc++里的q个引用Q语义上?#8220;别名”的意思,我的理解是,一l指向同一个对象的别名应该只存储一份内存地址。当然具体实现可能会(x) 把引用当做一个不可变的指针来处理Q每个别名都存储自己的对象地址Q。但是请注意Q我们应该关注于它的语义Q即Q它没有M值的copyQ即使是一个地 址Q只是另外一个名字而已?br /> <br /> 但是java里面没有q样的概念,所有的地址传递其行ؓ(f)是值的传递方式,语义上统一成g递更为清晎ͼ我们只需要考虑q个值具体是什么,无非两种Q要么是基本cd|要么是个地址?br /> 所以我认ؓ(f)q个“引用”的概忉|到java中ƈ不合适。只有g递的说法更合理?/p> <img src ="http://m.tkk7.com/renyangok/aggbug/228524.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2008-09-12 10:25 <a href="http://m.tkk7.com/renyangok/archive/2008/09/12/228524.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] update-alternatives http://m.tkk7.com/renyangok/archive/2008/02/13/179749.html保尔?/dc:creator>保尔?/author>Wed, 13 Feb 2008 02:08:00 GMThttp://m.tkk7.com/renyangok/archive/2008/02/13/179749.htmlhttp://m.tkk7.com/renyangok/comments/179749.htmlhttp://m.tkk7.com/renyangok/archive/2008/02/13/179749.html#Feedback0http://m.tkk7.com/renyangok/comments/commentRss/179749.htmlhttp://m.tkk7.com/renyangok/services/trackbacks/179749.html
在说?update-alternatives 的详l内容之_(d)先让我们看看pȝ中已有的例子。打开l端Q执行下面的命o(h)Q?br />
herbert@natsu:~$ ls -l /usr/bin/editor
lrwxrwxrwx 1 root root 24 2004-09-26 08:48 /usr/bin/editor -> /etc/alternatives/editor
herbert@natsu:~$ ls -l /etc/alternatives/editor
lrwxrwxrwx 1 root root 12 2004-10-27 16:24 /etc/alternatives/editor -> /usr/bin/vim
herbert@natsu:~$

? 们看刎ͼeditor q个可执行命令实际上是个W号链接Q它指向 /etc/alternatives/editorQ? /etc/alternatives/editor 也是个符号链接,它指?/usr/bin/vim。这P当我输入 editor q回车时Q将执行 vim。之所以要?/usr/bin ?/etc/alternatives 中费?j)徏立这样两个链接,是要实C面说到的Ҏ(gu):(x)方便脚本
E序的编写和pȝ的管理?br />
下面我们来看看 update-alternatives 的功能。当?dng)如果你觉得我说得不详l,可以看看q个命o(h)?manpageQUPDATE-ALTERNATIVES(8)?br />
首先要介l的参数?--display。它使我们可以看C个命令的所有可选命令。执?br />
natsu:/home/herbert# update-alternatives --display editor
editor - status is auto.
 link currently points to /usr/bin/vim
/bin/ed - priority -100
 slave editor.1.gz: /usr/share/man/man1/ed.1.gz
/usr/bin/nvi - priority 19
 slave editor.1.gz: /usr/share/man/man1/nvi.1.gz
/bin/nano - priority 40
 slave editor.1.gz: /usr/share/man/man1/nano.1.gz
/usr/bin/vim - priority 120
 slave editor.1.gz: /usr/share/man/man1/vim.1.gz
/usr/bin/emacs21 - priority 0
 slave editor.1.gz: /usr/share/man/man1/emacs.1emacs21.gz
Current `best' version is /usr/bin/vim.
natsu:/home/herbert#

你可以看到我的机器上的所有可以用来被 editor 链接的命令?br />
下面说说 --config。这个选项使我们可以选择其中一个命令:(x)

natsu:/home/herbert# update-alternatives --config editor

There are 5 alternatives which provide `editor'.

  Selection Alternative
-----------------------------------------------
      1 /bin/ed
      2 /usr/bin/nvi
      3 /bin/nano
*+    4 /usr/bin/vim
      5 /usr/bin/emacs21

Press enter to keep the default[*], or type selection number: 4
Using `/usr/bin/vim' to provide `editor'.
natsu:/home/herbert#

我ƈ没有修改它,因ؓ(f)我还是比较喜?vim 的。当?dng)你可以选择别的E序?br />
? 到这里我们就要介l一些概念了(jin)。首先,update-alternatives 在一般情况下是由 postinst ?prerm q样的安装脚本自动调用的Q所以一?alternative 的状态有两种Q自动和手动。每?alternative 的初始状态都是自动。如果系l发现管理员手动修改?jin)一? alternativeQ它的状态就从自动变成了(jin)手动Q这样安装脚本就不会(x)更新它了(jin)。如果你希望一?alternative 变回自动Q只要执?br />
update-alternatives --auto editor

可以了(jin)。你注意C(jin)吗?我们说到?#8220;名字”。该怎样写名字呢Q这是我们要介l的W二个概念:(x)
general name -- q是指一pd功能怼的程序的“公用”名字Q包括绝对\径)(j)Q比?/usr/bin/editor?br /> link -- q是指一?alternative ?/etc/alternative 中的名字Q比?editor?br /> alternative -- ֐思义Q这是指一个可选的E序所在的路径Q包括绝对\径)(j)Q比?/usr/bin/vim?br /> -- autoQ?-display ?--config 跟的都是 link。我们要说的W三个概忉|优先U。这个比较简单,当然优先U越高的E序好啦(在大多数情况下,我不想争论)(j)最后一个概忉|d从的 alternative。想想看Q你?/usr/bin/editor 链接C(jin) vimQ可是当你执?man editor 时看到的却是 emacs ?manpageQ你?x)做何感惛_Q这引Z(jin)d?alternative 的概念了(jin)Q当更新ȝ alternative Ӟ从的 alternative 也会(x)被更新?br />
说完q四个重要的概念后,我们介绍另外两个选项。至于其他的。。。。我怿你会(x)ȝ手册늚Q对吗?

W一个是 --install。它的格式是Q?br />
update-alternatives --install gen link alt pri [--slave sgen slink salt] ...

genQ? linkQaltQpri 分别是我们上面说q的。如果需要从?alternativeQ你可以?--slave 加在后面。如果你在向一个已l存在的 alternative l中d新的 alternativesQ该命o(h)?x)把q些 alternatives 加入到这个已l存在的 alternative l的
列表中,q用新的可选命令作为新的命令;否则Q将?x)徏立一个新的自动的 alternative l?br />
呜呼Q我加入?jin)一个错误的 alternative。我不想要这?alternative ?jin)。在q种情况 下,可以执行下面的命令:(x)

update-alternatives --remove name path

name 是一个在 /etc/alternatives 中的名字Q也是上面?linkQ?path 是希望删除的可选程序名的绝对\径名Q放?j),q样只是从列表中删除?jin)这个程序,q不?x)真的从盘上删除程序的可执行文Ӟ?j)。如果从一? alternative l中删除?jin)一个正在被链接的程序ƈ且这个组仍然没有变成I的Qupdate-alternatives ?x)自动用一个具有其他优先的可选程序代替原来的E序。如果这个组变成I的?jin),那么q这?alternative l都?x)被U除。如果删除的E序没有被链接,则只有有兌个程序的信息?x)被U除?br />
说个例子吧。我下蝲?EclipseQƈ且安装了(jin) gcj ?gij。可是我发现 GNU ?java 工具q不以q行 Eclipse。我只好?Sun 公司的网上下蝲?jin)它?java 工具 jdk。因为是自己安装的,我将它们安装?/usr/local 上,以便来重新安装 Linux pȝ时这些程序仍然可以用。于是我要做的就是用q个 jdk 中的 java ?javac 来代替系l原来的。执?br />
natsu:/home/herbert# update-alternatives --display java
java - status is auto.
 link currently points to /usr/local/j2sdk1.4.2_06/bin/java
/usr/bin/gij-wrapper-3.3 - priority 33
 slave java.1.gz: /usr/share/man/man1/gij-wrapper-3.3.1.gz
/usr/local/j2sdk1.4.2_06/bin/java - priority 100
 slave java.1.gz: /usr/local/j2sdk1.4.2_06/man/man1/java.1
Current `best' version is /usr/local/j2sdk1.4.2_06/bin/java.
natsu:/home/herbert# update-alternatives --display javac
javac - status is auto.
 link currently points to /usr/local/j2sdk1.4.2_06/bin/javac
/usr/bin/gcj-wrapper-3.3 - priority 33
 slave javah: /usr/bin/gcjh-wrapper-3.3
 slave javac.1.gz: /usr/share/man/man1/gcj-wrapper-3.3.1.gz
 slave javah.1.gz: /usr/share/man/man1/gcjh-wrapper-3.3.1.gz
/usr/bin/gcj-wrapper-3.4 - priority 33
 slave javah: /usr/bin/gcjh-wrapper-3.4
 slave javac.1.gz: /usr/share/man/man1/gcj-wrapper-3.4.1.gz
 slave javah.1.gz: /usr/share/man/man1/gcjh-wrapper-3.4.1.gz
/usr/local/j2sdk1.4.2_06/bin/javac - priority 100
 slave javah: /usr/local/j2sdk1.4.2_06/bin/javah
 slave javac.1.gz: /usr/local/j2sdk1.4.2_06/man/man1/javac.1
 slave javah.1.gz: /usr/local/j2sdk1.4.2_06/man/man1/javah.1
Current `best' version is /usr/local/j2sdk1.4.2_06/bin/javac.
natsu:/home/herbert#

Q你看到的是我更C后的Q就可以得到关于要更新哪?alternatives 的信息。我是这么更新的Q?br />
update-alternatives --install /usr/bin/javac javac /usr/local/j2sdk1.4.2_06/bin/javac 100 --slave /usr/bin/javah javah /usr/local/j2sdk1.4.2_06/bin/javah --slave /usr/share/man/man1/javac.1.gz javac.1.gz /usr/local/j2sdk1.4.2_06/man/man1/javac.1 --slave /usr/share/man/man1/javah.1.gz javah.1.gz /usr/local/j2sdk1.4.2_06/man/man1/javah.1
update-alternatives --install /usr/bin/java java /usr/local/j2sdk1.4.2_06/bin/java 100 --slave /usr/share/man/man1/java.1.gz java.1.gz /usr/local/j2sdk1.4.2_06/man/man1/java.1


]]>
Ubuntu7.10pȝ安装Q包括各U常用YӞ昑֍驱动Q双昄器,chroot sarge环境Q?/title><link>http://m.tkk7.com/renyangok/archive/2007/12/19/168813.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Wed, 19 Dec 2007 09:29:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2007/12/19/168813.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/168813.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2007/12/19/168813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/168813.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/168813.html</trackback:ping><description><![CDATA[1, insert Ubuntu 7.10 CD<br /> a, format disc(primary 10G ext3; extend 59G ext3; swap 1G)<br /> <br /> b, install(timezone shanghai; en_US; "prepare disc space" manual, or the system will partition autoly)<br /> <br /> c, auto restart, go on install system(remenber cut off the net line except the netwidth is large, or it will cost long time to download from far away)<br /> <br /> 2, config<br /> a, sources list<br /> sudo vim /etc/apt/sources.list<br /> # add "deb http://debian.exoweb.net/debian.cn99.com/debian etch main" into it<br /> sudo apt-get update<br /> sudo apt-get upgrade<br /> <br /> b, vedio card driver<br /> 在ubuntu7.10下装nvidia 7 series昑֍q|双屏显C:(x)<br /> <br /> 一Q显卡驱?Q?双显C器 <br /> (修改X配置命o(h)Qsudo dpkg-reconfigure xserver-xorg)<br /> <br /> 1Q到nvidia|站下蝲7pd昑֍的最新驱?br /> <br /> 2Qensure that the linux-restricted-modules or linux-restricted-modules-common packages have been uninstalled. Alternatively, you can edit the /etc/default/linux-restricted-modules or /etc/default/linux-restricted-modules-common configuration file and disable the NVIDIA linux-restricted kernel modules (nvidia, nvidia_legacy) via:<br /> <br /> DISABLED_MODULES="nv nvidia_new"<br /> <br /> 3, <br /> sudo apt-get remove --purge nvidia-glx nvidia-glx-new<br /> sudo rm /etc/init.d/nvidia-glx /etc/init.d/nvidia-kernel /lib/linux-restricted-modules/.nvidia_new_installed<br /> <br /> 4Q然后ctrl+alt+1q入tty1<br /> sudo /etc/init.d/gdm stop<br /> sudo sh NVIDIA-Linux-x86-100.14.23-pkg1.run<br /> (q时?x)出现错误提C,说少?#8220;libc header file...libc development package”)<br /> sudo apt-get install sudo apt-get install build-essential xorg-dev pkg-config linux-headers-$(uname -r), libc6-dev<br /> sudo sh NVIDIA-Linux-x86-100.14.23-pkg1.run<br /> sudo /etc/init.d/gdm start<br /> <br /> 用application -> system tools里的nvidia工具去配|双昄?br /> <br /> c, multi-language<br /> System -> Administration -> Language support: install English and Chinese<br /> check "input method"<br /> <br /> d, Wen Quan Yi font<br /> browse http://wenq.org/, and download 文泉驿点阵宋?and 文泉驿矢量正? then install them<br /> System -> Preference -> Appearance -> Fonts 前四w择Q点阵宋体(WenQuanYi Bitmap SongQ, W五不改(MonospaceQ?br /> sudo fc-cache -f -v (h字体~存Q每ơ修改字体都要这P不然Xorg?x)很?<br /> <br /> e, stardict                    <br /> sudo apt-get install stardict<br /> (http://stardict.sourceforge.net/Dictionaries_zh_CN.php 下蝲朗道英汉Q汉英字?<br /> tar -xjvf *** --directory /usr/share/stardict/dic/<br /> <br /> f, pidgin internet messager<br /> sudo apt-get install gaim-guifications<br /> config: Tools -> Plugins -> (check) Guifications; then, config it to uncheck on "Chat message"<br /> <br /> 3, install and config Software<br /> sudo apt-get install postgresql-8.1 python2.4 ipython vim-gnome sun-java5-jdk eclipse subversion build-essential ssh build-essential meld kompare<br /> <br /> a, postgresql<br /> sudo su - postgres (for user postgres has Null password, so you can't just "su - postgres", or you can sudo "sudo passwd postgres" to set password for postgres, then "su - postgres")<br /> createuser (enter username and password.)<br /> config postgresql as below:<br /> In /etc/postgresql/8.1/main/postgresql.conf, Change listen_addresses to '*' and change datestyle to 'ISO,European' and uncomment them.<br /> In /etc/postgresql/8.1/main/pg_hba.conf, 最后加入一?#8220;host        all    justin        127.0.0.1/16        trust”<br /> <br /> b, eclipse<br /> sudo eclipse, exit, eclipse<br /> <br /> c, ssh<br /> When other mathines want to ssh or scp your mathine which is new OS, it should "rm ~/.ssh/known_hosts" to reload the new Cert.<br /> <br /> d, kompare<br /> add a file svndiff in src with context<br /> """<br /> if [ $1 ] ; then<br />     svn up -r $1<br />     svn st -q<br />     svn log -r $1<br />     PRE=`expr $1 - 1`<br />     svn diff --diff-cmd=diff -x "-U 10000" -r$PRE:$1 > /tmp/$1.diff<br />     cat /tmp/$1.diff | kompare -<br /> else<br />     svn up<br />     svn st<br />     svn diff --diff-cmd=diff -x "-U 10000" | kompare -<br /> fi<br /> """<br /> then, in src, ./svndiff 9827 will show diff about r9827<br /> <br /> e, firefox add-ons<br /> firebug, flashblock<br /> <br /> 3, chroot<br /> a,<br /> sudo apt-get install debootstrap<br /> sudo debootstrap --arch i386 etch /home/etch http://debian.exoweb.net/debian.cn99.com/debian/<br /> (if in 64 bit system, use --arch amd64)<br /> sudo chroot /home/etch<br /> #in etch as root<br /> apt-get install locales<br /> dpkg-reconfigure locales #(choose en_us UTF8 as before)<br /> apt-get install vim vim-gnome xbase-clients less sudo postgresql-client subversion<br /> echo "etch" > /etc/debian-chroot<br /> visudo (add user justin to sudo)<br /> adduser justin (删除的命令是userdel justin)<br /> <br /> 在ubuntu?usr/bin/etch加入Q?br /> sudo cp /etc/passwd /home/etch/etc/<br /> sudo cp /etc/shadow /home/etch/etc/<br /> sudo cp /etc/group /home/etch/etc/<br /> sudo cp /etc/sudoers /home/etch/etc/<br /> sudo cp /etc/resolv.conf /home/etch/etc/<br /> sudo cp /etc/hosts /home/etch/etc/<br /> <br /> ?etc/fstab加入Q?br /> /home   /home/etch/home    none    bind 0 0<br /> /tmp    /home/etch/tmp     none    bind 0 0<br /> /dev    /home/etch/dev     none    bind 0 0<br /> /proc   /home/etch/proc    none    bind 0 0<br /> sudo chroot /home/etch/  su - justin<br /> <br /> 现在可一享受chroot的双pȝ?br /> <br /> b, run X in etch 3 steps<br /> b1, (etch)mkdir /tmp/.X11-unix<br /> (ubuntu)sudo echo "/tmp/.X11-unix/x0 /home/justin/etch/tmp/.X11-unix/x0 none bind 0 0" >> /etc/fstab<br /> # another way is write it in to /etc/fstab, or sudo mount --bind /tmp/*** /home/justin/etch/tmp/***<br /> b2, (etch)vim ~/.bashrc # add "export DISPLAY=:0.0"<br /> b3, (ubuntu) cp ~/.Xauthority ~/etch/home/justin/ Q其实这步不需要,因ؓ(f)上面已经?home mountC(jin)/home/etch/home?jin)?j)<br /> <br /> c, install java<br /> #download jdk-1_5_0_14-linux-i586.bin to /opt/, and into etch/opt/<br /> sudo chmod +x jdk-1_5_0_14-linux-i586.bin<br /> sudo ./jdk-1_5_0_14-linux-i586.bin<br /> vim ~/.bashrc<br /> #add below in the end of .bashrc<br /> #export JAVA_HOME=/opt/jdk1.5.0_14<br /> #export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar<br /> #export PATH=$JAVA_HOME/bin:$PATH<br /> <br /> java -version<br /> #java version "1.5.0_14"<br /> #Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03)<br /> #Java HotSpot(TM) Client VM (build 1.5.0_14-b03, mixed mode, sharing)<br /> <font size="-1">配置默认<font color="#c60a00">Java</font>使用哪个 <font color="#c60a00">sudo</font> update-alternatives --config <font color="#c60a00">java</font></font><br /> <img src ="http://m.tkk7.com/renyangok/aggbug/168813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2007-12-19 17:29 <a href="http://m.tkk7.com/renyangok/archive/2007/12/19/168813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求两个数或多个数的最大公U数法?qing)其实?/title><link>http://m.tkk7.com/renyangok/archive/2007/12/15/167956.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Sat, 15 Dec 2007 07:40:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2007/12/15/167956.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/167956.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2007/12/15/167956.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/167956.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/167956.html</trackback:ping><description><![CDATA[一Q两个数的最大公U数Q?br /> <br /> 1、欧几里L(fng)?<br /> <p style="margin: 5px; line-height: 150%;"> <br /> Ƨ几里d法又称辗{盔R法,用于计算两个整数a,b的最大公U数。其计算原理依赖于下面的定理Q?<br /> <br /> 定理Qgcd(a,b) = gcd(b,a mod b) <br /> <br /> 证明Qa可以表示成a = kb + rQ则r = a mod b <br /> 假设d是a,b的一个公U数Q则?<br /> d|a, d|bQ而r = a - kbQ因此d|r <br /> 因此d?b,a mod b)的公U数 <br /> <br /> 假设d ?b,a mod b)的公U数Q则 <br /> d | b , d |r Q但是a = kb +r <br /> 因此d也是(a,b)的公U数 <br /> <br /> 因此(a,b)?b,a mod b)的公U数是一L(fng)Q其最大公U数也必然相{,得证 <br /> <br /> Ƨ几里d法是Ҏ(gu)q个原理来做的,其算法用C++语言描述为:(x)</p> <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><font face="新宋?><span style="color: #0000ff;">void</span> <span style="color: #ff0000;">swap</span><span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> <span style="color: #0000cc;">&</span> a<span style="color: #0000cc;">,</span> <span style="color: #0000ff;">int</span> <span style="color: #0000cc;">&</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />      <span style="color: #0000ff;">int</span> c <span style="color: #0000cc;">=</span> a<span style="color: #0000cc;">;</span> <br />        a <span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">;</span> <br />        b <span style="color: #0000cc;">=</span> c<span style="color: #0000cc;">;</span> <br /> <span style="color: #0000cc;">}</span> <br /> <br /> <span style="color: #0000ff;">int</span> gcd<span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> a<span style="color: #0000cc;">,</span><span style="color: #0000ff;">int</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />      <span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>0 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> a <span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />          <span style="color: #0000ff;">return</span> b<span style="color: #0000cc;">;</span> <br />      <span style="color: #0000cc;">}</span> <br />      <span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span> 0 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />          <span style="color: #0000ff;">return</span> a<span style="color: #0000cc;">;</span> <br />      <span style="color: #0000cc;">}</span> <br />      <span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>a <span style="color: #0000cc;">></span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />          <span style="color: #ff0000;">swap</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />      <span style="color: #0000cc;">}</span> <br />      <span style="color: #0000ff;">int</span> c<span style="color: #0000cc;">;</span> <br />      <span style="color: #0000ff;">for</span><span style="color: #0000cc;">(</span>c <span style="color: #0000cc;">=</span> a <span style="color: #0000cc;">%</span> b <span style="color: #0000cc;">;</span> c <span style="color: #0000cc;">></span> 0 <span style="color: #0000cc;">;</span> c <span style="color: #0000cc;">=</span> a <span style="color: #0000cc;">%</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />            a <span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">;</span> <br />            b <span style="color: #0000cc;">=</span> c<span style="color: #0000cc;">;</span> <br />      <span style="color: #0000cc;">}</span> <br />      <span style="color: #0000ff;">return</span> b<span style="color: #0000cc;">;</span> <br /> <span style="color: #0000cc;">}</span></font></span></code></p> <p style="margin: 5px; line-height: 150%;"> 2、Stein法 <br /> Ƨ几里d法是计两个数最大公U数的传l算法,它无Z理论q是从效率上都是很好的。但是有一个致命的~陷Q这个缺陷只有在大素数时才会(x)昄出来?<br /> <br /> 考虑现在的硬件^収ͼ一般整数最多也是64位,对于q样的整敎ͼ计算两个C间的模是很简单的。对于字长ؓ(f)32位的q_Q计两个不过32位的整数? 模,只需要一个指令周期,而计?4位以下的整数模,也不q几个周期而已。但是对于更大的素数Q这L(fng)计算q程׃得不qh设计Qؓ(f)?jin)计两个超q? 64位的整数的模Q用户也怸得不采用cM于多位数除法手算q程中的试商法,q个q程不但复杂Q而且消耗了(jin)很多CPU旉。对于现代密码算法,要求计算 128位以上的素数的情冉|比皆是,设计q样的程序迫切希望能够抛弃除法和取模?<br /> <br /> Stein法由J. Stein 1961q提出,q个Ҏ(gu)也是计算两个数的最大公U数。和Ƨ几里d法 法不同的是QStein法只有整数的移位和加减法,q对于程序设计者是一个福韟?<br /> <br /> Z(jin)说明Stein法的正性,首先必须注意C下结论:(x) <br /> <br /> gcd(a,a) = aQ也是一个数和它自n的公U数是其自n <br /> gcd(ka,kb) = k gcd(a,b)Q也是最大公U数q算和倍乘q算可以交换Q特D的Q当k=2Ӟ说明两个偶数的最大公U数必然能被2整除 <br /> <br /> C++/java 实现 <br /> <code><span style="color: #000000;"><font face="新宋?></font></span></code></p> <p style="margin: 5px; line-height: 150%;"><code><span style="color: #000000;"><font face="新宋?><span style="color: #ff9900;">// c++/java stein 法 <br /> </span><span style="color: #0000ff;">int</span> gcd<span style="color: #0000cc;">(</span><span style="color: #0000ff;">int</span> a<span style="color: #0000cc;">,</span><span style="color: #0000ff;">int</span> b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span> <br />      <span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;"><</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">{</span></font><font face="新宋?><span style="color: #ff9900;">//arrange so that a>b <br /> </span>         <span style="color: #0000ff;">int</span> temp <span style="color: #0000cc;">=</span> a<span style="color: #0000cc;">;</span> <br />            a <span style="color: #0000cc;">=</span> b<span style="color: #0000cc;">;</span> <br />            b<span style="color: #0000cc;">=</span>temp<span style="color: #0000cc;">;</span> <br />      <span style="color: #0000cc;">}</span> <br />      <span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>0<span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>b<span style="color: #0000cc;">)</span></font><font face="新宋?><span style="color: #ff9900;">//the base case <br /> </span>        <span style="color: #0000ff;">return</span> a<span style="color: #0000cc;">;</span> <br />      <span style="color: #0000ff;">if</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">%</span>2<span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>0 <span style="color: #0000cc;">&</span><span style="color: #0000cc;">&</span> b<span style="color: #0000cc;">%</span>2 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>0<span style="color: #0000cc;">)</span></font><font face="新宋?><span style="color: #ff9900;">//a and b are even <br /> </span>         <span style="color: #0000ff;">return</span> 2<span style="color: #0000cc;">*</span>gcd<span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />      <span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span> a<span style="color: #0000cc;">%</span>2 <span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span> 0<span style="color: #0000cc;">)</span></font><font face="新宋?><span style="color: #ff9900;">// only a is even <br /> </span>         <span style="color: #0000ff;">return</span> gcd<span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />      <span style="color: #0000ff;">if</span> <span style="color: #0000cc;">(</span> b<span style="color: #0000cc;">%</span>2<span style="color: #0000cc;">=</span><span style="color: #0000cc;">=</span>0 <span style="color: #0000cc;">)</span></font><font face="新宋?><span style="color: #ff9900;">// only b is even <br /> </span>         <span style="color: #0000ff;">return</span> gcd<span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">,</span>b<span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span> <br />      <span style="color: #0000ff;">return</span> gcd<span style="color: #0000cc;">(</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">+</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">,</span><span style="color: #0000cc;">(</span>a<span style="color: #0000cc;">-</span>b<span style="color: #0000cc;">)</span><span style="color: #0000cc;">/</span>2<span style="color: #0000cc;">)</span><span style="color: #0000cc;">;</span></font><font face="新宋?><span style="color: #ff9900;">// a and b are odd <br /> </span><span style="color: #0000cc;">}</span></font></span></code></p> 二,多个数的最大公U数Q?python实现Q取出数la中最的Q从2到最的循环Q找出其中最大的能被数组中所有数整除的那个数Q就是最大公U数)<br /> def gcd(a):<br />     a.sort()<br />     min = a[0]<br />     result = 1<br />     for i in range(2, min+1):<br />         flag = True<br />         for j in a:<br />             if j % i != 0:<br />                 flag = False<br />         if flag == True:<br />             result = i<br />     return result<br /> <img src ="http://m.tkk7.com/renyangok/aggbug/167956.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2007-12-15 15:40 <a href="http://m.tkk7.com/renyangok/archive/2007/12/15/167956.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>l合数学QCatalan?/title><link>http://m.tkk7.com/renyangok/archive/2007/11/16/161089.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Fri, 16 Nov 2007 10:07:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2007/11/16/161089.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/161089.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2007/11/16/161089.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/161089.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/161089.html</trackback:ping><description><![CDATA[Catalan敎ͼ(x)(for http://acm.pku.edu.cn/JudgeOnline/problem?id=2084)<br /> <br /> C_n = ΣC_i*C_(n-i)Q其?≤i<nQ?br /> C_n = C(2n,n) / (n+1)Q?其中C(2n, n) 表示l合敎ͼ公式为:(x)C(n, k) = n! / (k!(n-k)!)<br /> C_n=C_(n-1)*(4n-2)/(n+1)?br /> <br /> 它的意义有很多,例如Qn+1边Ş用对角线划分? 三角形的Ҏ(gu)敎ͼn?1和n?1满所有部分和不小于零的排列数Q具有n个节点的二叉?wi)的数?#8230;…<br /> <br /> Q详l说明参考:(x)http://hi.baidu.com/kikoqiu/blog/item/81d792015ab13e01738da51d.htmlQ?br /> <img src ="http://m.tkk7.com/renyangok/aggbug/161089.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2007-11-16 18:07 <a href="http://m.tkk7.com/renyangok/archive/2007/11/16/161089.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>crontab用法http://m.tkk7.com/renyangok/archive/2007/11/02/157783.html保尔?/dc:creator>保尔?/author>Fri, 02 Nov 2007 08:56:00 GMThttp://m.tkk7.com/renyangok/archive/2007/11/02/157783.htmlhttp://m.tkk7.com/renyangok/comments/157783.htmlhttp://m.tkk7.com/renyangok/archive/2007/11/02/157783.html#Feedback0http://m.tkk7.com/renyangok/comments/commentRss/157783.htmlhttp://m.tkk7.com/renyangok/services/trackbacks/157783.html
crontab [ -u user ] file
crontab [ -u user ] { -l | -r | -e }

指o(h)說明

crontab 提供我們在固定的間隔時間執行自a的E式、系i指令或 shell secrip。時間間隔的單位可以是分鐘、小時、日、週、月?qing)以上的Li合。允a׃用者離R執行,並且可以執行結果以 email 通知使用者。因此,非常a合週期性的理分析或資料備份等工作?br />
基本上,crontab 的指令格式分為六個部分,前五個為時間間隔Q最後則是執行的指o(h)。每一個部分用I格來區隔?br />
?-- 0-59
?-- 0-23
?-- 1-31
?-- 1-12 或用英文名E?br /> 星期 -- 0-7 或用英文名E?br /> 工作命o(h) -- 指o(h)Qshell scriptQ程?...(使用i對路徑)
以上?crontab 的基本格式?br />
達R說明

-u user
以指定的使用者n份,埯 crontab 工作。此達R僅供 root 使用?br />

-l
示使用者現行的 crontab 檔?br />
-r
U除現行?crontab 檔?br />
-e
進入 vi R輯 crontab ?如有a定 VISUAL ?EDITOR 環境變數Q怎用該環境變數所a定的編輯器來編?。在使用者退出編輯器後,會自動將所R輯 crontab 檔,|入 crontab 埯?br /> 盔R檔案

/etc/cron.allow
/etc/cron.deny

實例說明

# crontab -l
# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.3672 installed on Thu Jan 1 15:55:18 2004)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
0 0-23/6 * * * /usr/bin/webalizer
30 3 * * * /root/fbin/bak-web
#

先前曾提刎ͼcrontab 的格式分成六個部分,前五個是時間參數。在上例中你會發N?jin)數字與英文名稱Q有使用到符?*"Q這個符號代表每一單位的意思,譬如 30 3 * * * 既代?30?3?每日 每月 星期的每天?br />
時間的指定,可以是單一的數字,或幾個數字用逗號來連接。看下例

30 3,12 * * * /root/fbin/bak-web

其中的第二項?3,12Q這代?3 以及(qing) 12 時的意思。再來看下例

30 */6 * * * /root/fbin/bak-web

我把W二項改?*/6 這代表每 6 時Q也相當?6,12,18,24 的作用。此外還有一個區D늚做法

30 8-18/2 * * * /root/fbin/bak-web

我把W二項改?8-18/2 這代表在 8 時?18 時之間?2 時Q也相當?8,10,12,14,16,18 的作用?br />
在認知的以上介紹各項時間用法後,你可以視實際的需要自行組合。用上的彈性是相當自由的。這篇暫時到此?br />



]]>
diff和patch使用指南http://m.tkk7.com/renyangok/archive/2007/10/25/155792.html保尔?/dc:creator>保尔?/author>Thu, 25 Oct 2007 02:22:00 GMThttp://m.tkk7.com/renyangok/archive/2007/10/25/155792.htmlhttp://m.tkk7.com/renyangok/comments/155792.htmlhttp://m.tkk7.com/renyangok/archive/2007/10/25/155792.html#Feedback0http://m.tkk7.com/renyangok/comments/commentRss/155792.htmlhttp://m.tkk7.com/renyangok/services/trackbacks/155792.html(转自Q?/font>http://blog.chinaunix.net/u/24474/showart_217098.html)

diff和patch是一对工P在数学上来说Qdiff是对两个集合的差q算Qpatch是对两个集合的和q算?br /> diff比较两个文g或文仉合的差异Qƈ记录下来Q生成一个diff文gQ这也是我们常说的patch文gQ即补丁文g?br /> patch能将diff文gq用?原来的两个集合之一Q从而得到另一个集合。D个例子来说文件A和文件B,l过diff之后生成?jin)补丁文件C,那么着个过E相当于 A -B = C ,那么patch的过E就是B+C = A 或A-C =B?br /> 因此我们只要能得到A, B, C三个文g中的M两个Q就能用diff和patchq对工具生成另外一个文件?br />
q就是diff和patch的妙处。下面分别介l一下两个工L(fng)用法:

1. diff的用?br />
diff后面可以接两个文件名或两个目录名?如果是一个目录名加一个文件名Q那么只作用在那么个目录下的同名文g?br />
如果是两个目录的话,作用于该目录下的所有文Ӟ不递归。如果我们希望递归执行Q需要?r参数?br />
命o(h)diff A B > C ,一般A是原始文ӞB是修改后的文ӞCUCؓ(f)A的补丁文件?br /> 不加M参数生成的diff文g格式是一U简单的格式Q这U格式只标出?jin)不一L(fng)行数和内宏V我们需要一U更详细的格式,可以标识Z同之处的上下文环境,q样更有利于提高patch命o(h)的识别能力。这个时候可以用-c开兟?br />

2. patch的用?br />
patch用于Ҏ(gu)原文件和补丁文g生成目标文g。还是拿上个例子来说

patch A C p得到B, q一步叫做对A打上?jin)B的名字ؓ(f)C的补丁?br />
之一步之后,你的文gA变成了(jin)文gB。如果你打完补丁之后x复到A怎么办呢Q?br />
patch -R B C 可以重新还原到A?jin)?br />
所以不用担?j)?x)失去A的问题?br />
其实patch在具体用的时候是不用指定原文件的Q因丁文件中都已l记载了(jin)原文件的路径和名U。patch_聪明可以认出来。但是有时候会(x)有点? 问题。比如一般对两个目录diff的时候可能已l包含了(jin)原目录的名字Q但是我们打补丁的时候会(x)q入到目录中再用patch,着个时候就需要你告诉 patch命o(h)怎么处理补丁文g中的路径。可以利?pn开养I告诉patch命o(h)忽略的\径分隔符的个数。D例如下:(x)

A文g?DIR_A下,修改后的B文g在DIR_B下,一般DIR_A和DIR_B在同一U目录。我们ؓ(f)?jin)对整个目录下的所有文件一ơ性diff,我们一般会(x)到DIR_A和DIR_B的父目录下执行以下命?br />
diff -rc DIR_A DIR_B > C

q个时候补丁文件C中会(x)记录?jin)原始文件的路径?DIR_A/A

现在另一个用户得C(jin)A文g和C文gQ其中A文g所在的目录也是DIR_A?一般,他会(x)比较喜欢在DIR_A目录下面q行patch操作Q它?x)执?br />
patch < C

但是q个时候patch分析C文g中的记录Q认为原始文件是./DIR_A/AQ但实际上是./AQ此时patch?x)找不到原始文g。ؓ(f)?jin)避免这U情冉|们可以?p1参数如下

patch -p1 < C

此时Qpatch?x)忽略掉W??#8221;/”之前的内容,认ؓ(f)原始文g?./AQ这样就正确?jin)?br /> 使用patch

patch附带有一个很好的帮助Q其中罗列了(jin)很多选项Q但?9%的时间只要两个选项p满我们的需要:(x)

patch -p1 < [patchfile]

patch -R < [patchfile] (used to undo a patch)

-p1选项代表patchfile?nbsp;     文g名左边目录的层数Q顶层目录在不同的机器上有所不同。要使用q个选项Q就要把你的patch攑֜要被打补丁的目录下,然后在这个目录中q行path -p1 < [patchfile]?/font>

]]>
JDK1.4引入的新Ҏ(gu)之一--断言QassertQ?/title><link>http://m.tkk7.com/renyangok/archive/2007/10/12/152316.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Fri, 12 Oct 2007 05:16:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2007/10/12/152316.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/152316.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2007/10/12/152316.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/152316.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/152316.html</trackback:ping><description><![CDATA[<div><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;"><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">断言概述</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">~写代码Ӟ我们L?x)做Z些假设,断言是用于在代码中捕捉q些假设<span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> 可以断a看作是异常处理的一U高UŞ?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言表示Z些布?yu)(dng)表辑ּQ程序员怿在程序中的某个特定点该表辑ּgؓ(f)?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以在Q何时候启用和用断言验证Q因此可以在试时启用断a而在部v时禁用断a。同PE序投入q行后,最l用户在遇到问题时可以重新v用断a?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言可以创徏更稳定,品质更好且易于除错的代码</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">当需要在一个gؓ(f)</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">FALSE</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">时中断当前操作的话,可以使用断言</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">单元试必须使用断言Q?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Junit/JunitX</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">除了(jin)cd(g)查和单元试外,断言q提供了(jin)一U确定个U特性是否在E序中得到维护的极好的方?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言使我们向按契U式设计更近?jin)一?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <br /> </span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">常见的断aҎ(gu)?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">前置条g断言Q代码执行之前必d备的Ҏ(gu)?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">后置条g断言Q代码执行之后必d备的Ҏ(gu)?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">前后不变断言Q代码执行前后不能变化的Ҏ(gu)?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <br /> </span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">断言使用方式</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言可以有两UŞ?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">1.assert Expression1 <br /> 2.assert Expression1:Expression2 <br /> </span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">其中</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Expression1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">应该L一个布?yu)(dng)|</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Expression2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是断ap|时输出的p|消息的字W串。如?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Expression1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">为假Q则抛出一?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q这是一个错误,而不是一个异常,也就是说是一个不可控制异常(</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">unchecked Exception),AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">׃是错误,所以可以不捕获Q但不推荐这样做Q因为那样会(x)使你的系l进入不E_状态?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <br /> </span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">L(fng)断言</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言在默认情况下是关闭的Q要在编译时启用断言Q需要?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">source1.4</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">标记</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">javac source1.4 Test.java ,</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">在运行时启用断言需要?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -ea</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">参数</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">。要在系l类中启用和用断言可以使用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -esa </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -dsa</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">参数?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">例如Q?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">public >  public AssertExampleOne(){} <br />   public static void main(String args[]){ <br />     int x=10; <br />     System.out.println("Testing Assertion that x==100"); <br />     assert x=100;"Out assertion failed!"; <br />     System.out.println("Test passed!"); <br />   } <br /> } <br /> <br /> </span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">如果~译时未?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -source1.4,</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">则编译通不q?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">在执行时未加</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> -ea </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">时输Zؓ(f)</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">Testing Assertion that x==100 <br /> Test passed <br /> jre</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">忽略?jin)断a的就代码Q而用了(jin)该参数就?x)输Zؓ(f)</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">Testing Assertion that x==100 <br /> Exception in thread "main" java.lang.AssertionError: Out assertion failed! <br /> at AssertExampleOne.main(AssertExampleOne.java:6) <br /> <br /> <br /> </span></span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">断言的副作用</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">׃E序员的问题Q断a的用可能会(x)带来副作?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q例如:(x)</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">boolean isEnable=false; <br /> //... <br /> assert isEnable=true; <br /> </span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">q个断言的副作用是因为它修改?jin)程序中变量的值ƈ且未抛出错误Q这L(fng)错误如果不细?j)的(g)查是很难发现的。但是同时我们可以根据以上的副作用得C个有用的Ҏ(gu),Ҏ(gu)它来试断言是否打开?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <span style="color: #9370db;">public ><br />   public static void main(String args[]){ <br />     boolean isEnable=false; <br />     //... <br />     assert isEnable=true; <br />     if(isEnable==false){ <br />       throw new RuntimeException("Assertion shoule be enable!"); <br />     } <br />   } <br /> } <br /> <br /> <br /> </span></span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">何时需要用断a</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <span style="color: #9370db;">1.</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以在预计正常情况下E序不会(x)到达的地Ҏ(gu)|断a</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert false <br /> 2.</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言可以用于(g)查传递给U有Ҏ(gu)的参数。(对于公有Ҏ(gu)Q因为是提供l外部的接口Q所以必dҎ(gu)中有相应的参数检验才能保证代码的健壮性)(j)</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">3.</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言试Ҏ(gu)执行的前|条件和后置条g</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">4.</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">使用断言(g)查类的不变状态,保M情况下,某个变量的状态必L뀂(?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">age</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">属性应大于</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">0</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">于某个合适|(j)</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <br /> </span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">什么地方不要用断a</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言语句不是永远?x)执行,可以屏蔽也可以启?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">因此Q?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">1.</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">不要使用断言作ؓ(f)公共Ҏ(gu)的参数检查,公共Ҏ(gu)的参数永q都要执?/span></span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">2.</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">断言语句不可以有M边界效应Q不要用断a语句M改变量和改变Ҏ(gu)的返回?/span><br /> <br /> 下边是介l断a的用?/span><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;"><span style="font-size: 10pt; color: #9400d3; font-family: 宋体;">:</span></span><br /> <br /> assert<span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是在</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">J2SE1.4</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">中引入的新特性,</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assertion</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是在代码中包括的布?yu)(dng)型状态,E序员认个状态是</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">true</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">。一般来?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">在开发的时候是(g)查程序的安全性的Q在发布的时候通常都不使用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">。在</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">1.4</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">中添加了(jin)</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">关键字和</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">java.lang.AssertError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">cȝ支持?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">首先Q我们有必要从一个例子说?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert <br /> <br /> public >  public static void main(String[] args) { <br />     AssertTest at = new AssertTest(); <br />     at.assertMe(true); <br />     at.assertMe(false); <br />   } <br />   private void assertMe(boolean boo) { <br />     assert boo?true:false; <br />     System.out.println("true condition"); <br />   } <br /> } <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">E序中包含了(jin)</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的话Q你要用</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">javac -source 1.4 xxx.java</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来编译,否则~译器会(x)报错的。要惌</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得部分运行的话,要?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">java -ea xxx</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来运行,否则包含</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得行?x)被忽略。下面我们运?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">javac -source 1.4 AssertTest.java <br /> java -ea AssertTest <br /> </span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">看看l果的输出是Q?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> <span style="color: #9370db;">true condition <br /> Exception in thread "main" java.lang.AssertionError <br /> at AssertTest.assertMe(AssertTest.java:13) <br /> at AssertTest.main(AssertTest.java:7) <br /> <br /> </span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">当我们运?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">at.assertMe(true)</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得时候,׃</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert boo?true:false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">相当?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> assert true;</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">因此没有M问题Q程序往下执行打印出</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">true condition</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q但是执?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">at.assertMe(false)</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的时候相当于</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q这个时候解释器׃(x)抛出</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?jin),E序q止了(jin)。大家必L?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是承自</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Error</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得,因此你可以不再程序中</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">catch</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">它的Q当然你也可以在E序?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">catch</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">它然后程序可以l执行。例如:(x)</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">public >  public static void main(String[] args) { <br />     AssertTest at = new AssertTest(); <br />     try { <br />       at.assertMe(true); <br />       at.assertMe(false); <br />     } catch(AssertionError ae) { <br />       System.out.println("AsseriontError catched"); <br />     } <br />     System.out.println("go on"); <br />   } <br />   private void assertMe(boolean boo) { <br />     assert boo?true:false; <br />     System.out.println("true condition"); <br />   } <br /> } <br /> <br /> assert</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">q有另外一U表辄方式Q就?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert exp1:exp2;</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">其中</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">是个</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">boolean</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">q回值得表达式,?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以是原始的数据cd或者对象都可以例如Q?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">boolean boo = true; <br /> String str = null; <br /> assert boo = false</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">Q?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">str="error"; <br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">我们刚开始讲?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得Ş式,?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得时候,</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得默认构造器?x)被调用Q但?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert exp1:exp2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">q样的Ş式,?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp1</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">true</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的时候后?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">exp2</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">被或略,如果</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">false</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的话Q后面的表达式的l果?x)被计算出来q作?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">AssertionError</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">得构造器参数。看下面的例子:(x)</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">public >  public static void main(String[] args) { <br />     AssertTest at = new AssertTest(); <br />     at.assertMe(true); <br />     at.assertMe(false); <br />   } <br />   private void assertMe(boolean boo) { <br />     String s = null; <br />     assert boo?true:false:s = "hello world"; <br />     System.out.println("true condition"); <br />   } <br /> }</span><br /> <br /> q行的时候会(x)得到q样的结?</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <span style="color: #9370db;">true condition <br /> Exception in thread "main" java.lang.AssertionError: hello world <br /> at AssertTest.assertMe(AssertTest.java:14) <br /> at AssertTest.main(AssertTest.java:7) <br /> <br /> Assert</span></span><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">最好不要滥用,原因?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">q不一定都?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">enable</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的,下面两种情况׃应该?/span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert <br /> <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">不要?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">public</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">的方法里面检查参数是不是?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">null</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">之类的操作,</span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">例如<br /> <br /> public int get(String s) { <br />   assert s != null; <br /> } <br /> </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">如果需要检查也最好通过</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">if s = null </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">抛出</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">NullPointerException</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来检?/span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><br /> <br /> 不要?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">来检查方法操作的q回值来判断Ҏ(gu)操作的结果,</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="color: #9370db;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">例如<br /> <br /> assert list.removeAll();<br /> <br /> q样看v来好像没有问?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">但是x如果</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">assert </span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">disable</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">呢,那样他就不会(x)被执行了(jin)</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">所?/span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">removeAll()</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">操作没有被执行</span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;">可以q样代替</span></span></span><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> <br /> boolean boo = list.removeAl(); <br /> assert boo;</span></div> <span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> <span style="font-size: 10pt; color: #9370db; font-family: 宋体;"><span style="font-size: 10pt; color: #9370db; font-family: 宋体;"> </span></span></span></span> <img src ="http://m.tkk7.com/renyangok/aggbug/152316.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2007-10-12 13:16 <a href="http://m.tkk7.com/renyangok/archive/2007/10/12/152316.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python学习(fn)W记http://m.tkk7.com/renyangok/archive/2007/09/02/142080.html保尔?/dc:creator>保尔?/author>Sun, 02 Sep 2007 08:18:00 GMThttp://m.tkk7.com/renyangok/archive/2007/09/02/142080.htmlhttp://m.tkk7.com/renyangok/comments/142080.htmlhttp://m.tkk7.com/renyangok/archive/2007/09/02/142080.html#Feedback0http://m.tkk7.com/renyangok/comments/commentRss/142080.htmlhttp://m.tkk7.com/renyangok/services/trackbacks/142080.html阅读全文

]]>
.bash_profile?bashrc的区?/title><link>http://m.tkk7.com/renyangok/archive/2007/07/16/130504.html</link><dc:creator>保尔?/dc:creator><author>保尔?/author><pubDate>Mon, 16 Jul 2007 02:52:00 GMT</pubDate><guid>http://m.tkk7.com/renyangok/archive/2007/07/16/130504.html</guid><wfw:comment>http://m.tkk7.com/renyangok/comments/130504.html</wfw:comment><comments>http://m.tkk7.com/renyangok/archive/2007/07/16/130504.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/renyangok/comments/commentRss/130504.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/renyangok/services/trackbacks/130504.html</trackback:ping><description><![CDATA[<font size="2">/etc/profile:此文件ؓ(f)pȝ的每个用戯|环境信?当用L(fng)一ơ登录时,该文件被执行.q从/etc/profile.d目录的配|文件中搜集shell的设|?<br> <br> /etc/bashrc:为每一个运行bash shell的用h行此文g.当bash shell被打开?该文件被d.<br> <br> ~/.bash_profile:每个用户都可使用该文件输入专用于自己使用的shell信息,当用L(fng)录时,该文件仅仅执行一?默认情况?他设|一些环境变?执行用户?bashrc文g.<br> <br> ~/.bashrc:该文件包含专用于你的bash shell的bash信息,当登录时以及(qing)每次打开新的shell?该该文g被读?<br> <br> ~/.bash_logout:当每ơ退出系l?退出bash shell)?执行该文? <br> <br> 另外,/etc/profile中设定的变量(全局)的可以作用于M用户,而~/.bashrc{中讑֮的变?局?只能l承/etc/profile中的变量,他们?父子"关系.<br> <br> ~/.bash_profile 是交互式、login 方式q入 bash q行?br> <br> ~/.bashrc 是交互式 non-login 方式q入 bash q行?br> <br> 通常二者设|大致相同,所以通常前者会(x)调用后者?/font><img src ="http://m.tkk7.com/renyangok/aggbug/130504.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/renyangok/" target="_blank">保尔?/a> 2007-07-16 10:52 <a href="http://m.tkk7.com/renyangok/archive/2007/07/16/130504.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://yg36.com" target="_blank">Ʒþþþþþþþ</a>| <a href="http://bjymt.com" target="_blank">Ƶ</a>| <a href="http://www-01313.com" target="_blank">˳ɴƬ߹ۿŵӰ</a>| <a href="http://yy885.com" target="_blank">ĻһӰԺַ</a>| <a href="http://747767.com" target="_blank">91Ʒѹ</a>| <a href="http://778002.com" target="_blank">þþþþAVվ</a>| <a href="http://yulongfilm.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://www999973.com" target="_blank">ҹɫƵվ</a>| <a href="http://cc8n.com" target="_blank">޾ƷһۺϾƷ99</a>| <a href="http://zzo8.com" target="_blank">vavavaþ</a>| <a href="http://7755ga.com" target="_blank">þAV˳׽ </a>| <a href="http://zwdyw.com" target="_blank">һѹۿ</a>| <a href="http://k67m.com" target="_blank">ɫ͵͵ɫݺ99</a>| <a href="http://yiqigxfc.com" target="_blank">˳ɵӰ߹ۿ</a>| <a href="http://ksdhao.com" target="_blank">һëƬѿѲ</a>| <a href="http://by6215.com" target="_blank">椸ѹۿ</a>| <a href="http://xsdjiagu.com" target="_blank">ƷŮߵӰ </a>| <a href="http://xy167.com" target="_blank">ݺۺۺɫ</a>| <a href="http://zgbeian.com" target="_blank">aëƬ100ѹۿ</a>| <a href="http://3789re.com" target="_blank">vƷƵ400</a>| <a href="http://bx85.com" target="_blank">˳߹ۿվƵ</a>| <a href="http://ulihix.com" target="_blank">av³˿һ</a>| <a href="http://686kp.com" target="_blank">ɫһ</a>| <a href="http://vankiz.com" target="_blank">߲91</a>| <a href="http://fanhaogo.com" target="_blank">18վڵ</a>| <a href="http://bz600.com" target="_blank">޹Ʒyw</a>| <a href="http://96yizhi.com" target="_blank">þ99ڹ</a>| <a href="http://xian66.com" target="_blank">ۺƵ</a>| <a href="http://fenglufzjx.com" target="_blank">9ᆱƷƵ</a>| <a href="http://747767.com" target="_blank">鶹紫ýƷ</a>| <a href="http://qqcnm.com" target="_blank">Իavҹҹˬ</a>| <a href="http://w6626.com" target="_blank">㽶þһ</a>| <a href="http://gstywy.com" target="_blank">99þþþþѿ</a>| <a href="http://srztw.com" target="_blank">þwww˳_Ƭ</a>| <a href="http://33303339.com" target="_blank">޾ƷһۺϾƷ99 </a>| <a href="http://codecampo.com" target="_blank">ͬgayƬ</a>| <a href="http://obtainfo.com" target="_blank">һƵ</a>| <a href="http://hmjx-tape.com" target="_blank">ȫһҹëƬ</a>| <a href="http://ebhqd.com" target="_blank">޼Ļ</a>| <a href="http://www-887234.com" target="_blank">鶹ȫַ</a>| <a href="http://317777aa.com" target="_blank">ӾƷӹۿƬ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>