項目越來越大,每次需要重新編譯整個項目都是一件很浪費時間的事情。Research了一下,找到以下可以幫助提高速度的方法,總結一下。
1. 使用tmpfs來代替部分IO讀寫
2.ccache,可以將ccache的緩存文件設置在tmpfs上,但是這樣的話,每次開機後,ccache的緩存文件會丟失
3.distcc,多機器編譯
4.將屏幕輸出列印到內存文件或者/dev/null中,避免終端設備(慢速設備)拖慢速度。
tmpfs
有人說在Windows下用了RAMDisk把一個項目編譯時間從4.5小時減少到了5分鍾,也許這個數字是有點誇張了,不過粗想想,把文件放到內存上做編譯應該是比在磁碟上快多了吧,尤其如果編譯器需要生成很多臨時文件的話。
這個做法的實現成本最低,在Linux中,直接mount一個tmpfs就可以了。而且對所編譯的工程沒有任何要求,也不用改動編譯環境。
mount -t tmpfs tmpfs ~/build -o size=1G
用2.6.32.2的Linux Kernel來測試一下編譯速度:
用物理磁碟:40分16秒
用tmpfs:39分56秒
呃……沒什麼變化。看來編譯慢很大程度上瓶頸並不在IO上面。但對於一個實際項目來說,編譯過程中可能還會有打包等IO密集的操作,所以只要可能,用tmpfs是有益無害的。當然對於大項目來說,你需要有足夠的內存才能負擔得起這個tmpfs的開銷。
make -j
既然IO不是瓶頸,那CPU就應該是一個影響編譯速度的重要因素了。
用make -j帶一個參數,可以把項目在進行並行編譯,比如在一台雙核的機器上,完全可以用make -j4,讓make最多允許4個編譯命令同時執行,這樣可以更有效的利用CPU資源。
還是用Kernel來測試:
用make: 40分16秒
用make -j4:23分16秒
用make -j8:22分59秒
由此看來,在多核CPU上,適當的進行並行編譯還是可以明顯提高編譯速度的。但並行的任務不宜太多,一般是以CPU的核心數目的兩倍為宜。
不過這個方案不是完全沒有cost的,如果項目的Makefile不規范,沒有正確的設置好依賴關系,並行編譯的結果就是編譯不能正常進行。如果依賴關系設置過於保守,則可能本身編譯的可並行度就下降了,也不能取得最佳的效果。
ccache
ccache工作原理:
ccache也是一個編譯器驅動器。第一趟編譯時ccache緩存了GCC的「-E」輸出、編譯選項以及.o文件到$HOME/.ccache。第二次編譯時盡量利用緩存,必要時更新緩存。所以即使"make clean; make"也能從中獲得好處。ccache是經過仔細編寫的,確保了與直接使用GCC獲得完全相同的輸出。
ccache用於把編譯的中間結果進行緩存,以便在再次編譯的時候可以節省時間。這對於玩Kernel來說實在是再好不過了,因為經常需要修改一些Kernel的代碼,然後再重新編譯,而這兩次編譯大部分東西可能都沒有發生變化。對於平時開發項目來說,也是一樣。為什麼不是直接用make所支持的增量編譯呢?還是因為現實中,因為Makefile的不規范,很可能這種「聰明」的方案根本不能正常工作,只有每次make clean再make才行。
安裝完ccache後,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,鏈到/usr/bin/ccache上。總之確認系統在調用gcc等命令時會調用到ccache就可以了(通常情況下/usr/local /bin會在PATH中排在/usr/bin前面)。
安裝的另外一種方法:
vi ~/.bash_profile
把/usr/lib/ccache/bin路徑加到PATH下
PATH=/usr/lib/ccache/bin:$PATH:$HOME/bin
這樣每次啟動g++的時候都會啟動/usr/lib/ccache/bin/g++,而不會啟動/usr/bin/g++
效果跟使用命令行ccache g++效果一樣
這樣每次用戶登錄時,使用g++編譯器時會自動啟動ccache
繼續測試:
用ccache的第一次編譯(make -j4):23分38秒
用ccache的第二次編譯(make -j4):8分48秒
用ccache的第三次編譯(修改若干配置,make -j4):23分48秒
看來修改配置(我改了CPU類型...)對ccache的影響是很大的,因為基本頭文件發生變化後,就導致所有緩存數據都無效了,必須重頭來做。但如果只是修改一些.c文件的代碼,ccache的效果還是相當明顯的。而且使用ccache對項目沒有特別的依賴,布署成本很低,這在日常工作中很實用。
可以用ccache -s來查看cache的使用和命中情況:
cache directory /home/lifanxi/.ccachecache hit 7165cache miss 14283called for link 71not a C/C++ file 120no input file 3045files in cache 28566cache size 81.7 Mbytesmax cache size 976.6 Mbytes
可以看到,顯然只有第二編次譯時cache命中了,cache miss是第一次和第三次編譯帶來的。兩次cache佔用了81.7M的磁碟,還是完全可以接受的。
distcc
一台機器的能力有限,可以聯合多台電腦一起來編譯。這在公司的日常開發中也是可行的,因為可能每個開發人員都有自己的開發編譯環境,它們的編譯器版本一般是一致的,公司的網路也通常具有較好的性能。這時就是distcc大顯身手的時候了。
使用distcc,並不像想像中那樣要求每台電腦都具有完全一致的環境,它只要求源代碼可以用make -j並行編譯,並且參與分布式編譯的電腦系統中具有相同的編譯器。因為它的原理只是把預處理好的源文件分發到多台計算機上,預處理、編譯後的目標文件的鏈接和其它除編譯以外的工作仍然是在發起編譯的主控電腦上完成,所以只要求發起編譯的那台機器具備一套完整的編譯環境就可以了。
distcc安裝後,可以啟動一下它的服務:
/usr/bin/distccd --daemon --allow 10.64.0.0/16
默認的3632埠允許來自同一個網路的distcc連接。
然後設置一下DISTCC_HOSTS環境變數,設置可以參與編譯的機器列表。通常localhost也參與編譯,但如果可以參與編譯的機器很多,則可以把localhost從這個列表中去掉,這樣本機就完全只是進行預處理、分發和鏈接了,編譯都在別的機器上完成。因為機器很多時,localhost的處理負擔很重,所以它就不再「兼職」編譯了。
export DISTCC_HOSTS="localhost 10.64.25.1 10.64.25.2 10.64.25.3"
然後與ccache類似把g++,gcc等常用的命令鏈接到/usr/bin/distcc上就可以了。
在make的時候,也必須用-j參數,一般是參數可以用所有參用編譯的計算機CPU內核總數的兩倍做為並行的任務數。
同樣測試一下:
一台雙核計算機,make -j4:23分16秒
兩台雙核計算機,make -j4:16分40秒
兩台雙核計算機,make -j8:15分49秒
跟最開始用一台雙核時的23分鍾相比,還是快了不少的。如果有更多的計算機加入,也可以得到更好的效果。
在編譯過程中可以用distccmon-text來查看編譯任務的分配情況。distcc也可以與ccache同時使用,通過設置一個環境變數就可以做到,非常方便。
總結一下:
tmpfs: 解決IO瓶頸,充分利用本機內存資源
make -j: 充分利用本機計算資源
distcc: 利用多台計算機資源
ccache: 減少重復編譯相同代碼的時間
這些工具的好處都在於布署的成本相對較低,綜合利用這些工具,就可以輕輕鬆鬆的節省相當可觀的時間。上面介紹的都是這些工具最基本的用法,更多的用法可以參考它們各自的man page。
5.還有提速方法是把屏幕輸出重定向到內存文件或/dev/null,因對終端設備(慢速設備)的阻塞寫操作也會拖慢速度。推薦內存文件,這樣發生錯誤時,能夠查看。
Ⅱ 什麼是WebPack,為什麼要使用它
1. 為什麼用 webpack?
他像 Browserify, 但是將你的應用打包為多個文件. 如果你的單頁面應用有多個頁面, 那麼用戶只從下載對應頁面的代碼. 當他么訪問到另一個頁面, 他們不需要重新下載通用的代碼.
他在很多地方能替代 Grunt 跟 Gulp 因為他能夠編譯打包 CSS, 做 CSS 預處理, 編譯 JS 方言, 打包圖片, 還有其他一些.
它支持 AMD 跟 CommonJS, 以及其他一些模塊系統, (Angular, ES6). 如果你不知道用什麼, 就用 CommonJS.
2. Webpack 給 Browserify 的同學用
對應地:
browserify main.js > bundle.js
webpack main.js bundle.js
Webpack 比 Browserify 更強大, 你一般會用 webpack.config.js 來組織各個過程:
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
}
};
這僅僅是 javaScript, 可以隨意添加要運行的代碼.
3. 怎樣啟動 webpack
切換到有 webpack.config.js 的目錄然後運行:
webpack 來執行一次開發的編譯
webpack -p for building once for proction (minification)
webpack -p 來針對發布環境編譯(壓縮代碼)
webpack --watch 來進行開發過程持續的增量編譯(飛快地!)
webpack -d 來生成 SourceMaps
4. JavaScript 方言
Webpack 對應 Browsserify transform 和 RequireJS 插件的工具稱為 loader. 下邊是 Webpack 載入 CoffeeScript 和 Facebook JSX-ES6 的配置(你需要 npm install jsx-loader coffee-loader):
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
mole: {
loaders: [
{ test: /\.coffee$/, loader: 'coffee-loader' },
{ test: /\.js$/, loader: 'jsx-loader?harmony' } // loaders 可以接受 querystring 格式的參數
]
}
};
要開啟後綴名的自動補全, 你需要設置 resolve.extensions 參數指明那些文件 Webpack 是要搜索的:
// webpack.config.js
mole.exports = {
entry: './main.js',
output: {
filename: 'bundle.js'
},
mole: {
loaders: [
{ test: /\.coffee$/, loader: 'coffee-loader' },
{ test: /\.js$/, loader: 'jsx-loader?harmony' }
]
},
resolve: {
// 現在可以寫 require('file') 代替 require('file.coffee')
extensions: ['', '.js', '.json', '.coffee']
}
};
Ⅲ 簡單的裝x編程代碼
數控編程代碼G代碼內容
G00快速定位
G01直線插補
G02圓弧插補
G03圓弧插補
G04暫停
G05
G06
G07
G08
G09
G10
G11
G12
G13刀架選擇:刀架A
G14刀架選擇:刀架B
G15
G16
G17刀具半徑補償:X-Y平面
G18刀具半徑補償:Z-X平面
G19刀具半徑補償:Y-Z平面
G20原始位置指令
G21ATC原始位置指令
G22扭距跳過指令
G23
G24ATC原始位置移動指令(不帶直線插補)
G25節點位置移動指令(不帶直線插補)
G26
G27
G28扭距極限指令取消
G29扭距極限指令
G30跳步循環
G31固定螺紋車削循環:軸向
G32固定螺紋車削循環:端面
G33固定螺紋車削循環
G34變螺距螺紋車削循環:增加螺距
G35變螺距螺紋車削循環:減少螺距
G36動力刀具軸-進給軸同步進給(正轉)
G37動力刀具軸-進給軸同步進給(反轉)
G38
G39
G40刀尖圓狐半徑補償:取消
G41刀尖圓狐半徑補償:左
G42刀尖圓狐半徑補償:右
G43
G44
G45
G46
G47
G48
G49
G50零點位移,主軸最高轉速指令
G51
G52六角刀架轉位位置誤差補償
G53
G54
G55
G56
G57
G58
G59
G60
G61
G62鏡像指令
G63
G64到位控制關
G65到位控制開
G66
G67
G68
G69
G70
G71復合固定螺紋車削循環:軸向
G72復合固定螺紋車削循環:徑向
G73軸向銑槽復合固定循環
G74徑向銑槽復合固定循環
G75自動倒角
G76自動倒圓角
G77攻絲復合固定循環
G78反向螺紋攻絲循環
G79
G80形狀定義結束(LAP)
G81軸向形狀定義開始(LAP)
G82徑向形狀定義開始(LAP)
G83坯材形狀定義開始(LAP)
G84棒料車削循環中改變切削條件(LAP)
G85調用棒料粗車循環(LAP)
G86調用重復粗車循環(LAP)
G87調用精車循環(LAP)
G88調用連續螺紋車削循環(LAP)
G89
G90絕對值編程
G91增量編程
G92
G93
G94每分進給模式(mm/min)
G95每轉進給模式(mm/rev)
G96恆周速切削開
G97G96取消
G98
G99
G100刀架A或刀架B單獨切削的優先指令
G101創成加工中直線插補
G102創成加工中圓弧插補(正面)(CW)
G103創成加工中圓弧插補(正面)(CCW)
G104
G105
G106
G107主軸同步攻絲,右旋螺紋
G108主軸同步攻絲,左旋螺紋
G109
G110刀架A恆周速切削
G111刀架B恆周速切削
G112圓弧螺紋車削CW
G113圓弧螺紋車削CCW
G114
G115
G116
G117
G118
G119刀具半徑補嘗:C-X-Z平面
G120
G121
G122刀架A副主軸W軸指令(13)
G123刀架B副主軸W軸指令(G14)
G124卡盤A有效原點
G125卡盤B有效原點
G126錐度加工模式OFF指令
G127錐度加工模式ON指令
G128M/C加工模式OFF指令
G129M/C加工模式ON指令
G130
G131
G132創成加工中圓弧插補(側面)(CW)
G133創成加工中圓弧插補(側面)(CCW)
G134
G135
G136坐標反轉結束或Y軸模式關
G137坐標反轉開始
G138Y軸模式開
G139
G140主軸加工模式的指定
G141副主軸加工模式的指定
G142自動脫模主軸加工模式的指定
G143自動脫模主軸和第3刀架加工模式的指定
G144W-軸控制OFF指令
G145W-軸控制ON指令
G146
G147
G148B-軸控制OFF指令
G149B-軸控制ON指令
G150
G151
G152可編程尾架定位(牽引尾架)
G153可編中心架G代碼(牽引)
G154W-軸單向定位指令
G155精確輪廓描繪模式ON指令
G156精確輪廓描繪模式OFF指令
G157
G158刀具軸方向刀具長度偏移量
G159刀具軸方向刀具長度偏移量(不帶旋轉位移偏移量)
G160取消刀具軸方向刀具長度偏移量
G161G代碼宏功能MODIN
G162G代碼宏功能MODIN
G163G代碼宏功能MODIN
G164G代碼宏功能MODIN
G165G代碼宏功能MODIN
G166G代碼宏功能MODIN
G167G代碼宏功能MODIN
G168G代碼宏功能MODIN
G169G代碼宏功能MODIN
G170G代碼宏功能MODIN
G171G代碼宏功能CALL
G172
G173
G174
G175
G176
G177
G178同步攻絲循環(CW)
G179同步攻絲循環(CCW)
G180動力刀具復合固定循環:取消
G181動力刀具復合固定循環:鑽孔
G182動力刀具復合固定循環:鏜孔
G183動力刀具復合固定循環:深孔鑽
G184動力刀具復合固定循環:攻絲
G185動力刀具復合固定循環:軸向螺紋車削
G186動力刀具復合固定循環:端面螺紋車削
G187動力刀具復合固定循環:軸向直螺紋車削
G188動力刀具復合固定循環:經向直螺紋車削
G189動力刀具復合固定循環:鉸孔/鏜孔
G190動力刀具復合固定循環:鍵槽切削循環
G191動力刀具復合固定循環:軸向鍵槽切削循環
G192
G193
G194
G195
G196
G197
G198
G199
G200
G201
G202
G203
G204
G205G代碼宏功能CALL
G206G代碼宏功能CALL
G207G代碼宏功能CALL
G208G代碼宏功能CALL
G209G代碼宏功能CALL
G210G代碼宏功能CALL
G211G代碼宏功能CALL
G212G代碼宏功能CALL
G213G代碼宏功能CALL
G214G代碼宏功能CALL
M代碼內容
M00程序停止
M01任選停止
M02程序結束
M03工作主軸起動(正轉)
M04工作主軸起動(反轉)
M05主軸停止
M06刀具交換
M07
M08冷卻液開
M09冷卻液關
M10主軸點動關
M11主軸點動開
M12動力刀具軸停止
M13動力刀具軸正轉
M14動力刀具軸反轉
M15C軸正向定位
M16C軸反向定位
M17機外測量數據通過RS232C傳送請求
M18主軸定向取消
M19主軸定向
M20尾架干涉區或主軸干涉監視關(對面雙主軸規格)
M21尾架干涉區或主軸干涉監視開(對面雙主軸規格)
M22倒角關
M23倒角開
M24卡盤干涉區關,刀具干涉區關
M25卡盤干涉區開,刀具干涉區開
M26螺紋導程有效軸Z軸指定
M27螺紋導程有效軸X軸指定
M28刀具干涉檢查功能關
M29刀具干涉檢查功能開
M30程序結束
M31
M32螺紋車削單面切削模式
M33螺紋車削時交叉切削模式
M34螺紋車削逆向單面切削模式
M35裝料器夾持器Z向滑動後退
M36裝料器夾持器Z向滑動前進
M37裝料器臂後退
M38裝料器臂前進到卸載位置
M39裝料器臂前進到卡盤位置
M40主軸齒輪空檔
M41主軸齒輪1檔或底速線圈
M42主軸齒輪2檔或高速線圈
M43主軸齒輪3檔
M44主軸齒輪4檔
M45
M46
M47
M48主軸轉速倍率無效取消
M49主軸轉速倍率無效
M50附加吹氣口1關
M51附加吹氣口1開
M52
M53
M54分度卡盤自動分度
M55尾架後退
M56尾架前進
M57M63取消
M58卡盤底壓
M59卡盤高壓
M60M61取消
M61圓周速度恆定切削時,恆定旋轉應答忽視
M62M64取消
M63主軸旋轉M碼應答忽視
M64主軸旋轉之外的M碼應答忽視
M65T碼應答忽視
M66刀架回轉位置自由
M67凸輪車削循環中同步運行模式取消
M68同步模式A運行開
M69同步模式B運行開
M70手動換到指令
M71
M72ATC單元定位在接近位置
M73螺紋車削類型1
M74螺紋車削類型2
M75螺紋車削類型3
M76工件捕手後退
M77工件捕手前進
M78中心架松開
M79中心架夾緊
M80過切前進
M81過切後退
M82
M83卡盤夾緊
M84卡盤松開
M85LAP粗車循環後不返回起始位置
M86刀架右回轉指定
M87M86取消
M88吹氣關
M89吹氣開
M90關門
M91開門
M92棒料進給器後退
M93棒料進給器前進
M94裝料器裝料
M95裝料器卸料
M96副軸用工件捕手後退
M97副軸用工件捕手前進
M98尾架低壓
M99尾架高壓
M100等待同步指令
M101外部M碼
M102外部M碼
M103外部M碼
M104外部M碼
M105外部M碼
M106外部M碼
M107外部M碼
M108外部M碼
M109取消M110
M110C軸連接
M111拾取軸自動零點設定
M112M-刀具軸在第三刀架上停止
M113M-刀具軸在第三刀架前進轉
M114M-刀具軸在第三刀架向回轉
M115卸料器打開
M116卸料器關閉
M117側頭前進
M118側頭後退
M119工件計數專用
數控車床編程代碼
M03主軸正轉
M03S1000主軸以每分鍾1000的速度正轉
M04主軸逆轉
M05主軸停止
M10M14。M08主軸切削液開
M11M15主軸切削液停
M25托盤上升
M85工件計數器加一個
M19主軸定位
M99循環所以程式
G代碼
G00快速定位
G01主軸直線切削
G02主軸順時針圓壺切削
G03主軸逆時針圓壺切削
G04暫停
G04X4主軸暫停4秒
G10資料預設
G28原點復歸
G28U0W0;U軸和W軸復歸
G41刀尖左側半徑補償
G42刀尖右側半徑補償
G40取消
G97以轉速進給
G98以時間進給
G73循環
G80取消循環G1000數據設置模態
G1100數據設置取消模態
G1716XY平面選擇模態
G1816ZX平面選擇模態
G1916YZ平面選擇模態
G2006英制模態
G2106米制模態
G2209行程檢查開關打開模態
G2309行程檢查開關關閉模態
G2508主軸速度波動檢查打開模態
G2608主軸速度波動檢查關閉模態
G2700參考點返回檢查非模態
G2800參考點返回非模態
G3100跳步功能非模態
G4007刀具半徑補償取消模態
G4107刀具半徑左補償模態
G4207刀具半徑右補償模態
G4317刀具半徑正補償模態
G4417刀具半徑負補償模態
G4917刀具長度補償取消模態
G5200局部坐標系設置非模態
G5300機床坐標系設置非模態
G5414第一工件坐標系設置模態
G5514第二工件坐標系設置模態
G5914第六工件坐標系設置模態
G6500宏程序調用模態
G6612宏程序調用模態模態
G6712宏程序調用取消模態
G7301高速深孔鑽孔循環非模態
G7401左旋攻螺紋循環非模態
G7601精鏜循環非模態
G8010固定循環注銷模態
G8110鑽孔循環模態
G8210鑽孔循環模態
G8310深孔鑽孔循環模態
G8410攻螺紋循環模態
G8510粗鏜循環模態
G8610鏜孔循環模態
G8710背鏜循環模態
G8910鏜孔循環模態
G9001絕對尺寸模態
G9101增量尺寸模態
G9201工件坐標原點設置模態
最簡單的C語言代碼最簡單的C語言代就是輸出「helloWord」,通常是作為初學編程語言時的第一個程序代碼。具體代碼如下:
#includestdio.h
intmain(){
?printf("Hello,World! ");
?return0;
}
(3)增量編譯會進行預處理嗎擴展閱讀:
1、程序的第一行#includestdio.h是預處理器指令,告訴C編譯器在實際編譯之前要包含stdio.h文件。
2、下一行intmain()是主函數,程序從這里開始執行。
3、下一行printf(...)是C中另一個可用的函數,會在屏幕上顯示消息"Hello,World!"。
4、下一行return0;終止main()函數,並返回值0。
Ⅳ C語言知識總結
c語言概要
第一章、 概述
1、 c語言的基本知識
1.1、 c語言的執行步驟
編輯-程序代碼的錄入,生成源程序*.c
編譯-語法分析查錯,翻譯生成目標程序*.obj
(語法或邏輯錯誤,從第一個開始改,變數定義,語句格式,表達式格式等)
鏈接-與其他目標程序或庫鏈接裝配,生成可執行程序*.exe
執行
1.2、 main函數的基本知識
main()函數的位置
c程序總是從main( )函數開始執行
一個c程序可以包含一個主函數,即main()函數;也可以包含一個main()函數和若干其它函數
1.3、 c程序的結構
函數與主函數
程序由一個或多個函數組成
必須有一個且只能有一個主函數main()
程序執行從main開始,在main中結束,其他函數通過嵌套調用得以執行
程序語句
C程序由語句組成
用「;」作為語句終止符
注釋
//
或
/* */ 為注釋,不能嵌套
不產生編譯代碼
1.4、c 程序書寫的規則
習慣用小寫字母,大小寫敏感
不使用行號,無程序行概念:通常一個語句佔一行
可使用空行和空格
常用鋸齒形的書寫格式;同一層次結構的語句上下對齊。
第二章、基本數據類型與運算
2.1、c程序的數據類型
注意類型和變數含義的不同(類型是固定好的名字,變數是自己起的名字)
變數佔用的存儲空間
數據類型
基本類型:整型、字元型、浮點型(單精度型,雙精度型)
構造類型:數組類型、結構體類型
指針類型
空類型
注意基本類型賦初值的方式
基本數據類型的表示形式
整形數據
十進制:以非0數字開頭,如:123,-9,0
八進制;以0數字開頭,如:0123,067
十六進制:以0x開頭,如:0x123,0xff
實型數據
十進制:必須帶小數點,如:123.0,-9.0
指數形式;如:1.23E3,0.9e-2,5e2
字元型數據
普通字元:如:』a』,』2』,』H』,』#』
轉義字元:如:』\n』,』\167』,』\xlf,』\\』
(實現幾列的對齊:指定寬度。如%100\ 『\t』製表位)
(字元串長度。「abc\n\t\\」 strlen 6; sizeof 7)
基本數據類型的存儲長度
整型
Int 位元組數 2 位數 16 數的表示範圍 -32768—32767
Short 2 16 -32768—32767
Long 4 32 -2147483648—2147483647
實型
Float 4 32 3.4e-38---3.4e38
Double 8 64 1.7e-308---1.7e308
字元型
Char 1 8 -128----127
2.2、標識符命名規則
C語言標志符命名規則
標識符有數字,字母,下劃線組成
標識符的首字元必須為字母和下劃線
標識符不能為c語言的保留字(關鍵字)
如:auto extern sizeof float static case for struct char goto switch continue in typedef const if union default long unsigned do register void double return else short while enum signed
算術運算符 + - * / %
關系運算符 > < == >= <= !=
邏輯運算符 ! && ||
位運算符 << >> ~ | ^ &
賦值運算符 = 及其擴展賦值運算符
條件運算符 ? :
逗號運算符 ,
指針運算符 * &
求位元組數運算符 sizeof
強制類型轉換運算符 (類型)
分量運算符 . ->
下標運算符 [ ]
其他 如函數調用運算符()
運算符的優先順序
由高到低:單目運算符,算數運算符,關系運算符,賦值運算符
說明:單目運算符:自增運算符,自減運算符,類型裝換運算符。結合方向:自右至左
如:++--I 先—i.。
算術運算 結合方向自左至右
2.3基本運算和表達式
關系表達式和邏輯表達式
(a>b)&&(x>y) (a==b)||(x==y) !=a||(a>b)
A&&b.a為0.不執行b
A||b a為1.不執行b
在 c 中邏輯運算結果:1代表「真」,0代表「假」;
判斷一個表達式是否真:0代表「假」,非0代表「真」
條件表達式 逗號表達式
如:k=5,k++
逗號值為5;k為6.
表達式1?表達式2 :表達式3
K=5>6 ? 1 : 0
2.4、混合運算的數據類型轉換
2/3+0.5 雙精度浮點型
第三章、順序結構程序設計
3.1、c語句的分類
簡單語句
表達式語句 表達式+分號
空語句 只有分號的語句
復合語句 用花括弧將若干語句括起來
流程式控制制語句
選擇語句 if ,switch
循環語句 while, do while , for
轉移語句 break ,continue ,return goto
3.2、格式輸入函數scanf
一般形式:scanf(「格式控制字元串「,地址列表);
使用scanf函數時,需要注意:
格式字元的個數必須與輸入項的個數相同,數據類型必須一一對應,非格式字元串(說明性的)要原封不動的輸入。
輸入實行數據時,可以不帶小數點,即按整型數據輸入
數值型數據與字元或字元串混合輸入時,需要注意輸入方式。
3.3、格式輸出函數printf
Printf(「格式控制字元串「,輸出列表);
指定輸出格式,由格式字元串和非格式字元串兩種組成,非格式字元串照原樣輸出。
%[標志][輸出最小寬度][.精度][長度]類型
標志:- 左對齊;+ 右對齊;
%f, %d, %c, %s
3.4、其他輸入輸出函數
Putchar getchar puts gets
第四章、選擇結構程序設計
If選擇結構
單分支
If(表達式)
語句
雙分支
If(表達式)
語句1
Else
語句2
多分支
If (表達式1)
語句1
Else if(表達式2)
語句2
。。。
Else if(表達式m)
語句m
Else
語句n
Switch(表達式)
{
Case 常量表達式1:語句1;break;
Case 常量表達式2:語句2;break;
。。。
Case 常量表達式m:語句m;break;
Default:語句n;break;
}
注意break的使用
第五章、循環結構程序設計
循環三要素
初始條件 ;終止條件 ;在初始條件和終止條件間反復做某件事情(循環體)
While(表達式)
語句
Do
語句
While(表達式);
For(循環體變數賦初值;循環條件;循環變數增量)
( for( ) ; // ; 進行時間延遲。在信息交換等時用。如for(i=0,i<100) ; 互相通訊的時間延遲。 Delay )
Break語句 :不能用於循環語句和switch語句之外的任何其他語句;跳出循環。
Continue語句 :跳過循環體中剩餘的語句而強行執行下一次循環;跳出本次循環。
第六章、函數與編譯預處理
6.1、函數的定義和調用
類型標識符 函數名 (形式參數列表)
{ 聲明部分
語句
}
例:
Int max (int x,int y)
{int z;<br>Z=x>y?x:y;<br>Return(z);}
6.2、局部變數和全局變數
注意函數中靜態變數的定義和使用
6.3、變數的存儲類型
局部變數的存儲類型
自動變數(auto) 動態存儲
局部靜態變數(static) 靜態存儲
寄存器變數(register) 靜態存儲
全局變數的存儲類型
自動變數(auto) 動態存儲
外部變數 (extern) 靜態存儲
全局靜態變數(static )靜態存儲
Extern 外部引用
Static 不能用extern 引用。
第七章、數組
7.1、一維數組的定義和使用
特別需要注意循環體的初值,終止條件
例:
Main()
{
Int I,a[10];
For(i=0;i<=9;i++)
A=I;
For(i=9;i>=0;i--)
Printf(「%d」,a);
}
注意下標問題
7.2、二維數組的定義和使用
二維數組的初始化
例如:
Int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
Int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
Int a[ ][4]={1,2,3,4,5,6,7,8,9,10,11,12};
Int a[ ][4]={{1,2,3,4},{5},{9,10,11,12}};
例如:int a[3][3]={{1},{2},{3}};
是對每一行的第一列元素賦值,未賦值的元素取0
7.3、字元數組和 字元串
字元串用字元數組來處理,結束標志符 『\0』
如:char c[ ]={「I am happy」};
用字元串常量使字元數組初值化
Char c[ ]={『I』,』 『,』a』,』m』,』 『,』h』,』a』,』p』,』p』,』y』,』\0』};
第八章、指針
8.1、地址和指針的概念
Int I;
Int *i_point;
8.2、指針變數和變數的地址
操作符:* &
8.3、指針和一維數組
若有定義
Int a[10];
Int *p=a;
分析下面表達式的含義:
A, &a,
*(a+i), a+I,
*(p+i), p+i
A=*(a+i)=*(P+i)
&a=a+i=p+i
8.4、指針與字元串
Main()
{
Char string[ ]=」I love china!」;
Printf(「%s\n」,string);
}
Main()
{ char *string=」I love china!」;
Printf(「%s\n」,string);
}
8.5、指針變數作為函數參數
形參的定義方式;實參的形式;參數的傳遞方式。
第九章、結構體
9.1、結構體類型和變數的定義
Struct 結構體名
{成員列表};
Struct student
{char stuNO[8];<br>Char name[20];<br>Char sex;<br>Int age;<br>Float score;<br>Char addr[30];<br>};
Stuct student
{char stuNO[8];<br>Char name[20];<br>Char sex;<br>Int age;<br>Float score;<br>Char addr[30];<br>};
Struct student stu1, stu2;
9.2、結構體變數的引用
一般形式為:
結構體變數名.成員名
9.3、結構體數組
結構體數組 結構體數組元素.成員名
指向結構體的指針變數
(*p).成員名
p->成員名
其他
Strcpy(字元數組1,字元串2)
Strcat(字元數組1,字元數組2)
Strcmp(字元串1,字元串2)
Strlen(字元數組)
Ⅳ 四、WRF初始化
WRF初始化主要包括理想初始化模擬和利用真實數據的模擬兩種類型,具體過程和要點如下:
1. 理想初始化模擬: 定義:從現有的1D或2D測深中為模型創建初始條件文件,假設簡化的分析地形。 初始化文件:針對特定情況存在單獨的初始化文件。對於其他理想化情況,使用mole_initialize_ideal.F。 編譯設定:在/.compile時進行設定,選擇不同的案例需要重新編譯代碼以選擇正確的模型初始化。
2. 利用真實數據的模擬: 預處理:使用WPS軟體包為每個大氣場和靜態場提供適應模型所選網格解析度的數據。 輸入數據:來源於先前運行的外部分析或預測模型,如原始GriB數據,WPS將生成粗網格文件。 數據時間片:WPS輸出文件只包含一個處理數據的時間片,通常按時間增量提供。
3. 模型垂直標高的設置: 方法:用戶可以使用eta_levels顯式定義完整的eta級別,或只給出e_vert由real計算eta_levels。 拉伸因子:使用表面和上部拉伸因子根據log p拉伸級別,直到最大厚度點。 層分布:dzstretch的值影響著層的分布,如dzstretch = 1.1時,在最低1 km處有12個層,在10 km以下有34個層等。 靈活配置:用戶可以使用名稱列表增加靈活性,指定完整標高之間第一個模型層的厚度以及允許的最大層厚度。
4. 其他注意事項: 在進行WRF初始化時,需要根據所選的模擬類型進行相應的設置和預處理。 垂直標高的設置對模擬結果有重要影響,用戶需要根據具體的研究需求和模型配置選擇合適的拉伸因子和層分布。
Ⅵ 讀對比Excel學SQL讀書筆記一
《對比Excel學SQL》讀書筆記一的主要內容如下:
基礎知識:
SQL基本知識:
不同資料庫比較:
數據獲取:
數據預處理:
數據類型轉換:
數據運算:
控制函數:
實戰篇:
以上是對《對比Excel學SQL》讀書筆記一的總結,涵蓋了基礎知識、SQL基本知識、不同資料庫比較、數據獲取與預處理、數據類型轉換、數據運算、控制函數以及實戰篇等方面的內容。
Ⅶ java程序編譯後會不會產生machine code
不會,只會生成位元組碼文件。
Java看起來設計得很像C++,但是為了使語言小和容易熟悉,設計者們把C++語言中許多可用的特徵去掉了,這些特徵是一般程序員很少使用的。例如,Java不支持go to語句,代之以提供break和continue語句以及異常處理。
Java還剔除了C++的操作符過載和多繼承特徵,並且不使用主文件,免去了預處理程序。因為Java沒有結構,數組和串都是對象,所以不需要指針。
Java能夠自動處理對象的引用和間接引用,實現自動的無用單元收集,使用戶不必為存儲管理問題煩惱,能更多的時間和精力花在研發上。
(7)增量編譯會進行預處理嗎擴展閱讀:
Java設計成支持在網路上應用,它是分布式語言。Java既支持各種層次的網路連接,又以Socket類支持可靠的流網路連接,所以用戶可以產生分布式的客戶機和伺服器。網路變成軟體應用的分布運載工具。Java程序只要編寫一次,就可到處運行。
在一個解釋性的環境中,程序開發的標准「鏈接」階段大大消失了。如果說Java還有一個鏈接階段,它只是把新類裝進環境的過程,它是增量式的、輕量級的過程。
因此,Java支持快速原型和容易試驗,它將導致快速程序開發。這是一個與傳統的、耗時的「編譯、鏈接和測試」形成鮮明對比的精巧的開發過程。