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