C語言代碼中看到"!!",捏了把汗

c語言基礎 發佈 2022-04-21T18:37:31.805841+00:00

作者:bug菌來源:最後一個bug版權歸原作者所有,如有侵權,請聯繫刪除。!!操作看到交流群里有朋友拋出一段C語言操作:offset = len/64 + !!(len%64);這兩個連續的感嘆號把有些人給整蒙圈了,還有些朋友調侃道: !!

作者:bug菌

來源:最後一個bug


版權歸原作者所有,如有侵權,請聯繫刪除。

!!操作

看到交流群里有朋友拋出一段C語言操作:

offset = len/64 + !!(len%64);

這兩個連續的感嘆號把有些人給整蒙圈了,還有些朋友調侃道: !!表示語氣加重,事情非常緊急得儘快處理,可把我給整笑了。

其實都是常規操作吧,只是這樣的寫法在正常的編碼過程中並不多見。

首先這兩個!!並不是什麼C語言新的關鍵字,而是!運算符的嵌套作用。

!在C語言中叫邏輯非運算符,是一種條件運算符。

語法形式 : !(條件)

其中的條件如果是false,則最終整個表達式為true;反之則為false,bug菌提醒一句:要與~進行區分,~是按位取反,很多初學者容易混淆。

語法形式 : !!(條件)

所以如上表達式就是兩個!的嵌套形式。

當然如果你想在項目代碼中變得無可替代,可以繼續如下操作:

語法形式 : !!!......!!(條件)

前提是你自己能看懂。

那麼回到!!,該操作所達到的效果便是條件邏輯與最終表達式的邏輯結果保持一致:

!!(false) == false
!!(非false) == true

而對於大部分編譯器false對應的是0,而true對應的是1,所以很多同志拿著邏輯結果參與數值運算。

offset = len/64 + !!(len%64);

該表達式的用處也非常清楚了,當len不能被64整除,則:

offset = len/64 + 1;

獲得正確的數據分組個數,這代碼應該是來源於存儲或者通信中。

但bug君覺得,儘量還是不要操作:

邏輯和數值運算最好是分開,以增加代碼的可讀性和可移植性。

還有個用處

最早看到這種處理方式是在判斷一個引腳的高底電平上:

u8GPIOLevel = !!(GPIOA_Data &  PIN_2);

!!在其中的作用跟之前是一樣的,使得表達式的數據結果與條件中的邏輯保持一致,便可以直接獲得結果。

客觀請留步

如果閣下正好在學習C/C++,看文章比較無聊,不妨關注下關注下小編的視頻教程,通俗易懂,深入淺出,一個視頻只講一個知識點。視頻不深奧,不需要鑽研,在公交、在地鐵、在廁所都可以觀看,隨時隨地漲姿勢。

關鍵字: