C、C++、Java回顾
一. C:
1. 函數(shù)調(diào)用調(diào)用約定:
1) __stdcall:?1)參數(shù)從右向左壓入堆棧,2)函數(shù)自身修改堆棧 3)返回值在EAX中, 函數(shù)名自動加前導(dǎo)的下劃線,后面緊跟一個@符號,其后緊跟著參數(shù)的尺寸。
如 int __stdcall func( int a, int b ) , 被聲明成: _func@8 ? ? 。進(jìn)行調(diào)用 func(a, ++b)時,相當(dāng)于 ++b, func((a, b)。
2) __cdecl: 1) 參數(shù)從右向左壓入棧,2)調(diào)用者進(jìn)行清棧。3返回值在EAX中。由于由調(diào)用者清理棧,所以允許可變參數(shù)函數(shù)存在,如?sprintf。
3) __fastcall: ?顧名思義,__fastcall的特點就是快,因為它通過 CPU寄存器來傳遞參數(shù)。他用 ECX和 EDX傳送前兩個雙字(DWORD)或更小的參數(shù),剩下的參數(shù)按照從右至左的方式入棧,函數(shù)自身清理堆棧,返回值在 EAX中。
4) __thiscall: 這是 C++ 語言特有的一種調(diào)用方式,用于類成員函數(shù)的調(diào)用約定。如果參數(shù)確定,this 指針存放于 ECX 寄存器,函數(shù)自身清理堆棧;如果參數(shù)不確定,this指針在所有參數(shù)入棧后再入棧,調(diào)用者清理棧。__thiscall 不是關(guān)鍵字,程序員不能使用。參數(shù)按照從右至左的方式入棧。
5) __pascal: 壓棧從左向右,函數(shù)自身清棧。該方式已廢棄。
總結(jié):上述5種方式中,除pascal外所有調(diào)用方式都是從右向左入棧,__cdecl 因為是調(diào)用者清棧而允許可變參數(shù)的存在。
VC 默認(rèn)是 __cdecl 方式 ,而Win API是 __stdcall 方式。VC的默認(rèn)調(diào)用方式可以設(shè)置。
gcc 默認(rèn)是 __stdcal 方式。
2. C的輸入輸出:
C語言輸入輸出函數(shù)有很多,標(biāo)準(zhǔn)I/O函數(shù)中包含了如下幾個常用的函數(shù):
輸入:scanf, fscanf, sscanf
輸出:printf, fprintf, sprintf
輸入字符(串):getc, getchar, gets, fgetc, fgets
輸出字符(串):putc, putchar, puts, fputc, fputs
scanf: ?scanf函數(shù)的返回值為int值,即成功賦值的個數(shù)。scanf("%s[^\n]", str)可以讀入空格。
getchar:?int getchar(void),?從標(biāo)準(zhǔn)輸入流讀取一個字符,只有換行時才從緩沖區(qū)中讀取。
getc: getc( FILE * fp ), 從文件中讀取一個字符。getc( stdin ) ?<=> ?getchar()
gets: char* gets(char *str),?gets主要是從標(biāo)準(zhǔn)輸入流讀取字符串并回顯,讀到換行符時退出,并會將換行符省去.
printf:%x, %X十六進(jìn)制,%o八進(jìn)制, %u 無符號, %p指針。
Q: 如何輸入一行帶空格的字符串?
method 1:?
? ? ? ? scanf("%[^\n]%*c", buf),原理:%[^\n]輸入一個以\n結(jié)尾的字符串,即一行字符串(\n除外)。%*c輸入一個字符(\n)但是不賦給任何一個變量,即吃掉這個字符。
method 2:
? ? ? ? gets或fgets用于輸入一行,?char *fgets(char *buf, int bufsize, FILE *stream)。
3. 常用函數(shù):
<ctype.h>: isdigit(), islower(), isspace(), isxdigit(), tolower(), atof(), atoi(), atol().
<stdlib.h>內(nèi)存操作: malloc(size), realloc(old_buf, size), calloc(size_1, size_2)分配并刷新內(nèi)存。
<time.h>時間: time( time * t), 返回1970年1月1日UTC時間到現(xiàn)在的秒數(shù)。
<string.h>字符串: strlen(), memset(), memcpy(), strncpy(), strstr(), strok()
<math.h>數(shù)學(xué)函數(shù): ceil(), floor(), sqrt(), pow(), log(double x)
Q:如何求2^x = 9 中的指數(shù)x? ? 注:log(x) = m <=> e^m = x
x = log(9) / log(2)
二. C++:
1. 輸入輸出:
cin, cin.get(), cin.getline(), getline(cin, str), cin.goodbit(), cin.clear()清除錯誤狀態(tài)。
<sstream>: stringstream 類用于把字符串當(dāng)作輸入輸出對象。
cin>>noskipws>>ch可以輸入空格、TAB、RET
cin.getline(buf, size, '\n')?
getline( cin, string_obj ) 返回 cin, cin.goodbit()返回cin流是否正常。
Q: 用getline輸入一行:
2.stl集合類: 順序容器(vector,deque,list)、關(guān)聯(lián)容器(set,multiset,map,multimap)、容器適配器(stack, queue, priority_queue)。
STL可分為容器(containers)、迭代器(iterators)、空間配置器(allocator)、配接器(adaptors)、算法(algorithms)、仿函數(shù)(functors)六個部分。
<algorithm><functional><iterator><utility><memory><numeric>
容器: vector, list, deque(雙隊列),set, multiset, stack, queue(音q),priority_queue, map, multimap。
迭代器: iterator. ?它由<utility>、<iterator>、<memory>這幾個頭文件組成。
算法:find, sort, copy, replace。
函數(shù)對象:bind1st, bind2st, not1, not2。
vector: 使用數(shù)組來存放。
list: 使用雙向鏈表存放。front(), back(), push_front(), push_back(), pop_back(), insert(), erase(), swap(), clear(), assign()
dequeue: 類似于list和vector的結(jié)合品,每一個堆(Heap)存放若干元素,堆之間通過指針連接。
容器:Iterator( begin, end, rbegin, rend), Capaciti( empty, size, max_size, resize )
操作:splice, remove, remove_if, unique, merge, sort, reverse
標(biāo)準(zhǔn)算法(約70種):
? ? ?變化:copy, remove, fill, replace, swap
? ? ?非變化: equal, for_each, count, count_if, search, find, binary_search
算法示例:
? ? ? Iterator find(Iterator first, Iterator last, const T &val);
? ? ? void sort( Iterator first, Iterator last)
? ? ? list_1.sort( greater<int>());
? ? ? map<T1, T2>::value_type( key, value);
? ? ??
三. Java:
1. 瑣碎:
?數(shù)據(jù)類型: byte, char.
?修飾符public, private, protected, default: default只允許同一包中調(diào)用,protected只允許有血緣關(guān)系的晚輩對長輩的調(diào)用。
?final: Java中無const(const只作為保留), final 變量本身不能被修改,但是它指向的對象可以被修改。final修飾的方法不能被重載。final類不能被繼承。
?方法覆蓋:子類方法與父類的簽名、返回值完全相同。子類可以通過super來顯示調(diào)用父類的方法。
?多態(tài):基類引用根據(jù)對象的真實子類,調(diào)用相應(yīng)的方法。
?類的修飾符:public、default 訪問說明符;final 該類無子類、abstrace該類為抽象類。 abstrace能修飾類和方法。
?接口:interface, ?interface 中所有方法都是public、abstrace屬性。
?包:包無嵌套關(guān)系, java.io.*并不是java.*的子包。
?內(nèi)部類:實名內(nèi)部類、匿名內(nèi)部類。
?比較: == ?與 equals, ==是比較變量的值,equals是比較內(nèi)容。
2.集合類:
Map( HashMap( LinkedHashMap ),HashTable, TreeMap)
Collection( List(Vector(Stack), ArrayList, LinkedList ), Set( TreeSet, HashSet( LinkedHashSet ) ) )
Iterator: hasNext(), next()
List: add(obj), get(int i), size(), iterator()
Set: add( obj ), get( obj )
Map: ?put( key, value), keSet(), value(), remove()
HashSet:?HashSet在存元素時,會調(diào)用對象的hashCode方法計算出存儲位置,然后和該位置上所有的元素進(jìn)行equals比較。故equals相同時,程序員要保證hashCode相同。
ArrayList, LinkedList, Vector: 只有Vector是線程安全的,其它兩個都不是線程安全的。
HashMap, HashTable: HashTable是線程安全的,不支持null,HashMap不是線程安全的, 支持null。
雜:
1.運(yùn)算符優(yōu)先級:
? ?算術(shù)、邏輯、關(guān)系、賦值。同一優(yōu)先級的看結(jié)合性。
2.補(bǔ)數(shù): ?char a=127, 則 a+=1, a== -128. ? (1,000,0000)
? ?負(fù)數(shù)的補(bǔ)數(shù):符號位為1, 然后讓其它位由其絕對值取反+1。
? ?負(fù)數(shù)的補(bǔ)碼:2^8 + x = ...
? ?如:-1為1,000,0001 => 1,111,1110=>1, 111,1111.
? ?-127: 按公式 2^8 + (-127) =1,000,0001
? ?-128: 2^8+(-2^7) = 1,000,0000
3. 進(jìn)程阻塞與時間片切換? ? 時間片切換 并不會引起進(jìn)程阻塞。
4. 驗證兩個數(shù)之和是否會溢出:
? ?a + b = c, 若溢出,則a和b的符號相同,與c的符號不同。? ?
int test_overflow(int a, int b){char byte;int int_size = sizeof(a) * sizeof(byte);int c = a + b;int fa = a>>(int_size-1);int fb = b >>(int_size-1);int fc = c >> (int_size-1);printf("%d + %d = %d\n", a, b, c );if ( !(fa^fb) && (fa^fc) ) printf("溢出。\n"); return 0; }
5. 指令集:
? ? ? ?CISC, RISC
? ?指令操作碼分為三種:定長操作碼,擴(kuò)展操作碼(指令定長,操作碼可以擴(kuò)展利用單操作數(shù)、無操作數(shù)的地址空間),霍夫曼指令碼。
6.冪指數(shù)與異或:
? 2 ^ 31 - 3 == ?,?由于c/c++無冪指數(shù)操作,"^"是異或操作符,位運(yùn)算優(yōu)先級比減運(yùn)算優(yōu)先級低。故相當(dāng)于 2^28
? ? ?n&(n-1) : 將n為1的最低位置為0.
? ? ?n&(-n): ?n最末位為1的位數(shù)相應(yīng)的的二進(jìn)制數(shù). ?如 2&(-2) = 2, ?4&(-4) = 4, (2+4)&(-2-4) = 2。
? ? ?n^(-n): 對應(yīng) -2, -4, -8, -16, ...這些數(shù)
7. c++與java的數(shù)組:
c++:? int a[]={1, 2, 3};? int a[10]={1, 2, 3}; int *a = new int[10];
java:? int [] a = {1, 2, 3}; int a[]= {1, 2, 3}; int a[][];
另外:java 中 int []a 與 int a[] 都可以使用, 但是,推薦使用 int [] a,它明確了a是一個數(shù)組類型。
8. java: byte char int:
byte: -128 ~ 127.
char: 0 ~ 65535.
int: -21.... +21..., 約21億。即 4+4+1=9 個0.
int i = 10000000000000000; 在java中會編譯異常,但是在c/c++中編譯可以通過。
9. java: FileInputStream.read()
無論二進(jìn)制文件還是文本文件,都可以用文件輸入流java.io.FileInputStream?以字節(jié)的方式進(jìn)行讀取操作。如果想以字符的形式讀取文本文件,則應(yīng)該使用java.io.FileReader 。注:從本質(zhì)上說,文件都是以字節(jié)碼(即所謂的二進(jìn)制碼)的形式存在的。如果這些字節(jié)碼表示的是某種字符集的一種編碼格式,如ASCII,UTF8, GB2312 等等,則習(xí)慣上把這個文件稱為文本文件。 java.io.FileReader除了提供文件讀取功能外,還內(nèi)置了解碼功能,因此說,如果讀取文本文件,java.io.FileReader 更方便些。
public abstract int read() throws IOException,這個方法讀取字節(jié)流中下一個字節(jié)。讀取的字節(jié)值是作為 int 類型返回的。實際返回值的范圍是 0 ~255 ,而不同于基本數(shù)據(jù)類型 byte 的范圍,-128 ~+127。如果所有數(shù)據(jù)都讀完了(即所謂的到達(dá)流終點),再調(diào)用這個方法,則返回-1。這是判定流中所有數(shù)據(jù)讀取完畢的唯一方式。
10. java: String, char, byte:
char [] a = {'你', '好', '媽'};?
System.out.println( (int)a.length);
char [] a = "你好嗎";? 這一個語句是錯誤的,不能把 String 轉(zhuǎn)換成 char [] 類型。
11. linux 與 windows編碼問題:
如何處理文件名編碼不一致的問題:
如何處理windows gbk編碼向linux的utf-8轉(zhuǎn)換: iconv -f gbk -t utf-8? file1.txt? -o? file2.txt
12. java HashTable 與 HashMap:
????? HashTable 與 HashMap 都是利用Hash方法存儲<key, value>,但是HashTable是同步的,HashMap不是線程安全的且其key可以有一個null。另外:HashMap的桶大小初始時為16,其對應(yīng)的線程安全類使用細(xì)粒度鎖(每個桶對應(yīng)一個鎖,且每一個桶對應(yīng)一個計數(shù)器,以此來處理訪問熱點問題)。
總結(jié)
以上是生活随笔為你收集整理的C、C++、Java回顾的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 医惠科技完成重组上市,开启智慧医疗服务新
- 下一篇: c++:vector对象的增长