int類型變量所占字節數是?
編譯器可以根據自身硬件來選擇合適的大小,但是需要滿足約束:short和int型至少為16位,long型至少為32位,并且short型長度不能超過int型,而int型不能超過long型。這即是說各個類型的變量長度是由編譯器來決定的,而當前主流的編譯器中一般是32位機器和64位機器中int型都是4個字節(例如,GCC)。數據類型占內存的位數實際上與操作系統的位數和編譯器(不同編譯器支持的位數可能有所不同)都有關 ,具體某種數據類型占字節數得編譯器根據操作系統位數兩者之間進行協調好后分配內存大小。具體在使用的時候如想知道具體占內存的位數通過sizeof(int)可以得到準確的答案。對于0來說,它的原碼和反碼都有兩種(分別為0000 0000,1000 0000,和0000 0000, 1111 1111),但是補碼只有一種(即0000 0000),-0的補碼形式等于對應的正數0的原碼00000000,取反為11111111,加1是00000000,答案仍然是0,溢出了。整數0,小數0的補碼都只有這一種形式。同時也是說,補碼沒有1000 0000這個值(用來干啥好呢?所以就賦給-128.。。。),其實不是的,-127的原,反,補為:1111?1111,?1000?0000,?1000?0001,因為窮舉法,補碼?1000?0000?為?-128?是不用懷疑的,所以, 8位有符號的整數取值范圍的補碼表示 1000 0000 到 0000 0000, 再到 0111 1111 即 -128 到 0, 再到 127 最終 -128 ~ +127,中間沒有中斷,一直是往上加1的,只不過到0的時候溢出了。-128沒有原碼,也沒有反碼,都被-0占了(分別是1000 0000和1111 1111)。一個二進制數的補碼的補碼就是原碼!!!(2019/3/27 補充一下,一個正數的補碼的補碼是它相對應的負數的補碼,同理,一個負數的補碼的補碼是它相對應的正數的補碼,也就是說,一個正數的原碼就是它相對應的負數的補碼,懂了沒?)枚舉類型enum的元素長度根據編譯器而定。在visual c++下,它和int一樣長,是4個字節,在GCC下它會取盡可能短的長度,例如你這個枚舉類型只有3種標識,那么它是一個字節。12的平方是int在GCC中的極限平方了,到了13的平方就會溢出,int型數組建立20萬個沒事,建立100萬個就創建不出了,因此在數組建立不出來時,盡量讓數組放在函數之外,因為如果數組太大,放在函數內有可能會崩潰,在函數之外則不會有這樣的問題。因為在函數外定義屬于全局變量,全局變量在靜態存儲區分配內存,而局部變量是在棧上分配內存空間的,如果數組太大,可能會造成棧溢出。使用static_cast可以找回存放在void指針中的值。一般用于malloc,它的返回值正是void,這叫自帶解釋。。double * dptr = static_cast<double*>(vptr);C11增加了一些新特性,and,or,not 何以取代&& || !真方便!for(expression : struct) 完全也可以用普通數組這個語法糖,但是指針就不行,而且是值傳遞的,也就是不能修改。括號失效:有時你明明以為加了括號可以保證萬無一失,但是還是可能跑偏了,例如int c = ++b * (a+b) 因為有那個自增的運算符,整個表達式異常兇險。。。要注意int的有無符號的問題,如果不注意的話,得出的結果會非常奇怪,例如: int x = 2; char * str = "abcd"; int y = (x - strlen(str) ) / 2; printf("%d\n",y); 結果應該是 -1 但是卻得到:2147483647 。為什么?因為strlen的返回值類型是size_t,也就是unsigned int ,與 int 混合計算時,int類型被自動轉換為unsigned int了,結果自然出乎意料。。。解決辦法就是強制轉換,變成 int y = (int)(x - strlen(str) ) / 2; 強制向有符號方向轉換(編譯器默認正好相反),所以牽扯到有符號無符號計算的問題,特別是存在討厭的自動轉換時,要倍加小心!(這里自動轉換時,無論gcc還是cl都不提示!!!) 為了避免這些錯誤,建議,凡是在運算的時候,確保你的變量都是 signed 的。 c編譯器中,僅支持C89規范的編譯器,只支持在作用域起始部分(大括號最開始)定義變量。支持C99或者部分支持C99的編譯器, 局部變量可以定義在任何位置。基本上絕大多數都支持了,甚至還有一部分支持for(int i),但是并不建議在C語言中用這個。早在C++98標準中就存在了auto關鍵字,那時的auto用于聲明變量為自動變量,自動變量意為擁有自動的生命期,這是多余的,因為就算不使用auto聲明,變量依舊擁有自動的生命期,C++98中的auto多余且極少使用,C++11已經刪除了這一用法,取而代之的是全新的auto:變量的自動類型推斷。auto可以在聲明變量的時候根據變量初始值的類型自動為此變量選擇匹配的類型。有時候不引用string頭文件仍然可以使用string,那是因為有可能某一個頭文件里包括了它自己的,不同平臺可能有不同,在這里不要偷懶。map的值是按照key升序排列的,也就是說,自動排列。對于輸入輸出,在最后輸出回車還是空格的問題上,聰明人都用三目元表達式(i==n-1)?"\n":" ",但是注意要把表達式全部用括號括起來,為了防止編譯器分析不當,而且這種情況時有發生。如何在類似 for(auto var:set){} 這種語句里確定var到底是不是最后一個?或者說set怎么確定其中的值是最后一個?這里有講究: var == *(--set.end()) 注意是自減而不是-1,--是重載了的,而-沒有重載,所以會報錯的,而且注意是前面自減才對。要用<iostream>而不要用<iostream.h>,后者只是僅僅支持字符流,而前者包含了一系列模板化的I/O類,二者在接口和執行上都是不同的。scanf 函數的返回值反映的是按照指定的格式符正確讀入的數據的個數。也就是說,可以運用while(scanf(“%d”,&x)==1){}來更加簡化沒有確定數據個數時的代碼段,那么,這里只能輸入字母來結束輸入,在scanf中,回車,空格,tab鍵是無關緊要的,也就是輸入多少也不會管,只有按下空格,再按Ctrl+z,然后再按回車,才算結束輸入,這時候scanf接受的是第一個空格之前的字符,在Linux中,按下回車,再按下Ctrl+D即可結束輸入,也就是說,scanf的這種特性基本沒用,只有在ACM中有用。scanf的返回值用在什么地方呢?用在沒有給出有多少數據,一次性輸入完就算的那種,這么寫: while(scanf("%d %d",&m,&n)!=EOF){}感覺還方便.gets在C ++中會產生bug,而且在C11標準中 被廢除,因此不建議使用,getline(cin, str)函數只能讀取string類型,不能讀取字符數組類型,cin.get可以讀取字符數組類型,并且只會遇到回車而結束。用法為cin.get(ch,長度),另外需要注意的是,這個函數會將換行符留在輸入隊列中,如果連續兩次調用,第二次將無法讀入,應加上一個不帶參數的cin.get吃掉換行符,推薦用cin.ignore(),因為看起來自帶注釋的感覺,另外cin>>noskipws也有讀取空格字符串的功能。一般的,常會有使用一次cin之后連續多次使用getline,但是,由于cin不讀入空格的特性,getline總會少輸入一行,所以正確姿勢是用cin.get()或者cin.ingnore(),感覺用后者更自帶注釋一些。"\n" 表示內容為一個回車符的字符串。std::endl 是流操作子,輸出的作用和輸出 “\n” 類似,但可能略有區別。std::endl 輸出一個換行符,并立即刷新緩沖區,由于流操作符 << 的重載,對于 ‘\n’ 和 “\n”,輸出效果相同。對于有輸出緩沖的流(例如cout、clog),如果不手動進行緩沖區刷新操作,將在緩沖區滿后自動刷新輸出。不過對于 cout 來說(相對于文件輸出流等),緩沖一般體現得并不明顯。但是必要情況下使用 endl 代替 ‘\n’ 一般是個好習慣。對于無緩沖的流(例如標準錯誤輸出流cerr),刷新是不必要的,可以直接使用 ‘\n’。fgets(buff,MAXN,fin)將讀取完整的一行存放到buff字符數組中,而且往往是以\n結尾(除了在文件結束前沒有遇到\n這種特殊情況)。當一個字符也沒有讀到,函數返回null。同樣有一個標準輸入板的gets(s)函數,里面只有一個數組參數,風險較大,不建議使用。而在scanf中,是不包括\n的,但是也不能在接受字符串中打上\n,回車是一個輸入完成鍵,在scanf與fgets混用時(我為什么要混用?可能以后再也不會混用了)要注意這個點。對于上下左右和別的一些擴展鍵使用getch會先返回一個224,再使用一次getch()這時返回的才是掃描碼。關于memset,只用它來初始化0就行了,初始化其他的,全錯!相信我,memset函數也是以字節為單位進行賦值的,對于int型,是四個字節,也就是將這四個字節設置成0x01010101, 轉換成十進制就是16843009。memset的作用是來將一段內存按自己進行初始化, 并非用來進行變量初始化。值得注意的是,c++的結構體是可以有構造函數的,這也可以說,如果構造一個鏈表結構體的話,那么就非常有用了是不是,在銷毀的時候順便釋放空間什么的,結構體中可以包含函數;也可以定義public、private、protected數據成員,結構體定義中默認情況下的成員是public,而類定義中的默認情況下的成員是private的。類中的非static成員函數有this指針,(而struct中沒有是錯誤的,一直被誤導啊,經過測試struct的成員函數一樣具有this指針),類的關鍵字class能作為template模板的關鍵字 即template<class T> class A{}; 而struct不可以。C++中定義結構體變量時可以不加struct關鍵字,也就是說,typedef可以在c++中省掉了。不建議使用全局對象,因為debug只能從main處進入,而類的初始化在main開始之前,所以根本沒辦法調試。另外,由于全局變量創建順序完全不可控,更不要讓全局變量之間相互依賴。
額,就先這么多吧。。