2016-08-26 42 views
-8
inline int inp() { 
    char c = gc(); 
    while(c<'0' || c>'9') c = gc(); 
    int ret = 0; 
    while(c>='0' && c<='9') { 
     ret = (ret << 3) + (ret << 1) + c - 48; 
     c = gc(); 
    } 
    return ret; 
} 

什麼是ret試圖通過左移運算符,然後減去48?你能解釋下面代碼中ret變量的工作嗎?

+0

幻數48是「0」的ASCII碼。 – Jarod42

+5

研究這段代碼,並在編寫自己的代碼時做相反的事。 – user4581301

回答

3

這是某種混淆或微優化:

  • ret << 3ret * 8
  • ret << 1ret * 2

所以(ret << 3) + (ret << 1)實際上是ret * 10。然後,在共同實施,字符'0'的整數值是48(ASCII值),所以:

(ret << 3) + (ret << 1) - 48 

其實就是:

ret * 10 - '0' 

所以這段代碼基本上是一個「古怪」的方式將表示數字的字符串(通過連續呼叫返回到gc())轉換爲int

+0

嘿謝謝回答! – Narender

相關問題