1. 程式人生 > >C語言的奇技淫巧

C語言的奇技淫巧

C語言

的tricks不多,但大多比較晦澀,就跟數學一樣需要循序漸進的理解,同時也需要對編譯器、C語言標準都有一定的理解。而C語言的雷區較多,也即有很多我們經常碰到的未定義行為(undefined behavior)。在看tricks前,我們先看個雷:

C
1 a=b+c;

它看起來很簡單,對嗎?但如果b和c加起來大於了上限,如INT_MAX,那編譯器會做什麼?事實上這裡會得到一個負數。這是非常令人煩躁的未定義舉動,尤其是你因為它而要debug的時候。當然,標準會告訴你每次都去檢查它沒有意義,我們要的只是一個高速語言。恩,讀者要記住一件事,玩標準的人不寫程式碼。而且,千萬不要輕易的忽略它們,它們都有可能造成致命的問題。——所以說C語言是高手才能真正玩好的語言。如果沒有對C語言較好的瞭解,不要輕易的使用各類tricks,說不定裡面就埋了個debug不出來的雷。

我們開始,先看個小技巧,舒緩一下心情:

編譯器判斷優化

1 2 #define likely(x)       __builtin_expect((x),1) #define unlikely(x)     __builtin_expect((x),0)

這個技巧就是在迴圈判斷時去期望是或否。這涉及到了編譯器優化,以及很經典的火車選路。在linux核心中十分常見。你可以給知道它的人加5分,懂一點核心挺好的。

定長型別

再來一個我們在強型別時不能忽略的:

stdint.h
1 2 3 4 5 6 7 8 9 10 11 12 #ifndef __int8_t_defined # define __int8_t_defined typedefsignedcharint8_t; typedefshortintint16_t; typedefintint32_t; # if __WORDSIZE == 64 typedeflongintint64_t; # else __extension__
typedeflonglongintint64_t; # endif #endif

這些型別非常棒,比起char, short, int, long的意思清晰十倍,尤其在bitmap運算時,最好用這些強型別(記得在算bits時要用UINT)。

但你可以看到專案組裡往往用

1 2 #define INT16 short #define INT32  long

這樣的程式碼來定義它們,實際上是錯誤的,乖乖的#include <stdint.h>為好。

逗號運算子

像這樣用是可以的。注意逗號取最後一個值返回。

1 2 3 4 for(inti=0;i&lt;10;i++,doSomethingElse()) { /* whatever */ }

結構體初始化

注意它不是一般意義上的全0初始化,而是邏輯0初始化,這裡引用一段stackoverflow上的英文:

memset/calloc do “all bytes zero” (i.e. physical zeroes), which is indeed not defined for all types. { 0 } is guaranteed to intilaize everything with proper logical zero values. Pointers, for example, are guranteed to get their proper null values, even if the null-value on the given platform is 0xBAADFOOD

1 structmystructa={0};

Bit fields

很有用的bit定義,尤其是用在某些演算法中

1 2 3 4 5 6 7 8 9 10 11 12 13 structcat{ unsignedintlegs:3;// 3 bits for legs (0-4 fit in 3 bits) unsignedintlives:4;// 4 bits for lives (0-9 fit in 4 bits) // ... }; cat make_cat() { cat kitty; kitty.

相關推薦

C#開發一:調試windows系統服務

選項 nbsp 調試 方法 href info bubuko 系統 .html 原文:C#開發奇技淫巧一:調試windows系統服務windows系統服務不能直接運行,只能在安裝完服務之後啟動、暫停、繼續、停止服務,導致服務的調試不能使用一般的斷點調試。 要調試系統服務,

C#開發二:根據dll文件加載C++或者Delphi插件

man int cnblogs 需要 pat method msg initial 函數指針 原文:C#開發奇技淫巧二:根據dll文件加載C++或者Delphi插件 這兩天忙著把框架改為支持加載C++和Delphi的插件,來不及更新blog了。 原來的

C

如果 %s def 完全 逆序 函數 遞歸實現 -s r+ 直接上代碼: (1).交換兩參數的值 #include <stdio.h>int main(){    int a = 10,b = 5;    a^=b^=a^=b;  

C#開發三:把dll放在不同的目錄讓你的程式更整潔

http://www.tuicool.com/articles/mQVrUbJ 程式目錄的整理 想必C#的開發者都遇到過這個問題,引用的dll都放在根目錄下,隨著專案的日益增大,根目錄下充滿了各種各樣的dll,非常的不美觀。 如果能夠把dll按照想要的目錄來存放,

C語言(積累)

列印引數巨集 #define INPUT_CHECK(x) \ if ((x)) \ {

C語言

C語言 的tricks不多,但大多比較晦澀,就跟數學一樣需要循序漸進的理解,同時也需要對編譯器、C語言標準都有一定的理解。而C語言的雷區較多,也即有很多我們經常碰到的未定義行為(undefined behavior)。在看tricks前,我們先看個雷:

C++ 進階筆記:一些庫函式……還有一些

一、奇技淫巧 1.取帶小數的餘數 (1)“整除”取餘法 #include<iostream> using namespace std; void main() { float a = 362.75; int b = 360; float aMod= a - ((i

C#

1.Enum轉陣列: System.Enum.GetValues(typeof(EnumKind)); 3.數組合並 using System.Linq;//需要引用 new string[] { "1", "2", "3", "4" }.Concat(new string[] {

之使用gzip進行文字語言識別

假設我們有三個很大的語料庫,分別是英語EN,德語DE 以及 亞塞拜然語AZ,當我們拿到一段新的語料NEW(長度足夠長),我們應該如何判斷NEW是哪種語言呢? 這實際上是自然語言處理中的一個基本問題,我們

C++ —— 巨集對於簡化類介面的

不知不覺接觸虛幻4也快有一年了吧,這一年裡對這款引擎或多或少都有一些瞭解。當使用C++程式設計時看到虛幻4對於巨集的奇技淫巧的使用時,哪怕是現在也感到相當驚豔,因此查閱了一些資料,寫篇部落格記錄一下。 類介面的相關工作 C++的目標之一就是把類的宣告和定義分

SQL(01):給查出的資料排序編個號【row_number() over(order by c)】(mysql,db2,oracle,sqlserver通用)

我們天天都在跟資料庫打交道,寫下的程式碼不計其數,寫下的SQL更是可以繞地球幾圈。這裡收集關於SQL的神奇語法及用法,雖然你可能沒有用過,但這些SQL卻可以在關鍵的時候,派上用場。 我對SQL語句的理解,可以比作一座橋樑,將零散的資料組合起來,拿到我所需要的有效資訊。也以此記錄一下使用心得 一. 語法

關於字符串和文件流的

童鞋 err pen spa 關於 文件大小 ood c_str 64bit 早早起來,發一篇來概括一下昨天晚上搞到深夜才學到的一些字符串和文件流的簡單操作。 (寫在前面:以下所有的文件流都以輸入文件流為例,另外這種文件讀寫方式與競賽時使用的有較大差別,NOIP黨裏C++剛

Mysql數據閃回的(binlog2sql)

mysql binlog2sql 一、概述binlog2sql是一個開源項目,應用於大眾點評線上環境。類似於ORACLE中的閃回功能,binlog2sql可以基於時間點或者位置偏移量進行數據恢復。從MySQL binlog解析出你要的SQL。根據不同選項,你可以得到原始SQL、回滾SQL、去除主鍵的I

CSS布局:各種居中

設置 ybds orm 必須 解決 html prim 分享 post CSS布局奇技淫巧:各種居中 2017-08-23 無雙 前端開發 作者:無雙 鏈接:www.cnblogs.com/2050/p/3392803.html 居中是我們使用css來布局時常

黑暗中的生物:利用快活生存

not 正在 ever reading 自己的 which cat 世界 round 今日導讀 如果讓你在伸手不見五指的黑暗當中生存,你能熬過幾天呢?而大千世界,無奇不有。在很多你不知道的角落,有些生物在完全黑暗的世界裏不僅活得相當快活,還進化出了各種令人瞠目結舌的驚奇技能

javascript 向下取整

mat asc floor math 轉化 java 目的 奇技淫巧 移位運算 let a=5/4|0 輸出a=1 利用了javascript在進行位運算前,先把浮點數轉化為整數的特性。 同理,也可以用移位運算,達到同樣目的 let a =5/4<

」博客園頁面美化(差不多是劃水

http 沒有 博客 -- erl text 頁面 ash spa 何為頁面美化?永遠沒有止境的亂搞也。 ——hzz 教材: 博客園美化

CF1063A Oh Those Palindromes

傳送門(當然上洛咕能搜到) 求指定字串最多回文子串個數 Ssy太強了... 學到一個新東西 就是如果一個字元有x個 那麼它能產生的最多的迴文串個數為C(x,2) 可以理解為選擇兩個字母作為邊界 然後發現 如果所有一樣的字母全都拼在一起 那麼總個數就是C(x,2) 所以答案就是一樣的放一起就OK

java的--意外行為與特性(譯文)

Java是一種非常成熟的程式語言 - 事實上,它已經走過21年了,如果它是一個人,它可以在美國隨便混!隨著年齡的增長,智慧也在增長,而至少有時候,有些東西會變得很怪異。在本文中,我將介Java語言的一些奇技淫巧的行為和特徵。 在這裡,沒有特別的順序去介紹一系列Java的奇技淫巧,僅供娛樂,或者你向朋友們推介

Noip前的大抱佛腳----

STL函式 set set查詢前驅後繼 multiset<int>::iterator iter; S.insert(x); iter=S.find(x);//返回迭代器 iter--;//前驅 int ans=*iter; S.erase(find(x)); return ans; 或者