天天看點

【No.6 switch的陷阱】

==【注意】== 程式語言隻是我們與計算機交流并讓計算機實作我們創造性思想的工具,可以并鼓勵深入掌握一門語言,但千萬别沉迷于鑽某種語言的牛角尖,一定要把握好二者間的度

本帖屬不定時連載貼,以試卷的形式提出一個比較基礎的問題供大家思考讨論,問題的解析将在下一更新貼中一并給出,這樣做是希望還不清楚問題的朋友有自己思考和讨論的時間,希望大家能從這些文章中有所收獲。

貼中問題屬我在學習C\C++過程中遇到的一些文法或者比較隐晦的程式問題,其中有自己的總結,也不乏網絡上搜尋到的經典解析,在此分享給大家,希望能起到抛磚引玉的作用

【No.6  switch的陷阱】

由于連載形式,每帖第二部分都配有上一問題的解答。為了保持文章的針對性和一緻性,此貼僅供交流讨論本次問題,若大家對上一問題有任何疑問,請通過解答末尾的傳送連結前往該問題貼回複讨論

[問題No.6]

請寫出以下代碼的執行結果

複制内容到剪貼闆

<code>#include&lt;iostream&gt; int main(int argc, char **argv) {   using namespace std;   int x = 0;   int i = 1;   switch(i)   {     case 1: x = 5;     case 2: ++x;     case 3: ++x;     default : x = 0;   }   cout&lt;&lt;x&lt;&lt;endl;   return EXIT_SUCCESS; }</code>

輸出結果

1

2

問題淺析

解決此題的關鍵在于無符号數與有符号數的比較以及數值的溢出問題,當有無符号數與有符号數同時存在于一條語句中時,有符号數總是被轉換成無符号數後再與無符号數進行計算。

<code>char GetChar(int x, int y) {   char c;   unsigned int a = x;    (a + y &gt; 10) ? (c=1) : (c=2);  //此處的y首先被轉換為無符号數,再與a求和,最後結果與10進行比較   return c; } //假設機器内int、unsigned int型變量大小為一個位元組(8位,便于解釋) char c1 = GetChar(7,4);     //x == 7,y == 4,y在機器内部的補碼表示為0000 0100     //a + y == 0000 0111     //       + 0000 0100     //       -------------     //         0000 1011 == 11 &gt; 10 故執行語句(c=1),函數傳回1 char c2 = GetChar(7,3);     //x == 7,y == 3,y在機器内部的補碼表示為0000 0011     //a + y == 0000 0111     //       + 0000 0011     //       -------------     //         0000 1010 == 10 不大于 10 故執行語句(c=2),函數傳回2 char c3 = GetChar(7,-7);     //x == 7,y == -7,y在機器内部的補碼表示為1111 1001     //a + y == 0000 0111     //       + 1111 1001     //       -------------     //      (1)0000 0000 == 0 &lt; 10 故執行語句(c=2),函數傳回2     //       |     //       此位溢出 char c4 = GetChar(7,-8);     //x == 7,y == -8,y在機器内部的補碼表示為1111 0111     //a + y == 0000 0111     //       + 1111 0111     //       -------------     //         1111 1110 == 254 &gt; 10 故執行語句(c=1),函數傳回1</code>

     本文轉自Bill_Hoo 51CTO部落格,原文連結:http://blog.51cto.com/billhoo/733261,如需轉載請自行聯系原作者

繼續閱讀