-
大的放到小的
左右兩邊標明類型
小的放到大的
左邊表明,右邊不表明
查看全部 -
#include<stdio.h>
int main(int argc,char **argv)
{
? ? int a=;
? ? short b=(short)a;
? ? return 0;
}
查看全部 -
enum Week { Mon, // 星期一 Tue, // 星期二 Wed, // 星期三 Thu, // 星期四 Fri, // 星期五 Sat, // 星期六 Sun, // 星期日 }; int main(int argc,char **argv) { Week week = Week::Fri; return 0; }查看全部
-
我們來看看這個函數(shù)里其他的部分。
首先是 (int argc,char **argv) ,這是一個參數(shù)列表。我們可以看到,這里有兩個參數(shù),第一個參數(shù)argc表示參數(shù)個數(shù),第二個參數(shù)argv是參數(shù)組,兩個參數(shù)一起表達了這個程序的啟動參數(shù)。
另外一個是return語句,我們可以看到 main 函數(shù)有一個返回值,這個返回表示程序的執(zhí)行結(jié)果。我們這個 Hello Wolrd 程序里面,返回的是 0。0 表示程序執(zhí)行成功,沒有出現(xiàn)問題。如果這里返回的是非 0 ,那么表示程序執(zhí)行出現(xiàn)問題。
查看全部 -
一個程序里,有且只有一個 main 函數(shù)。程序從 main 函數(shù)開始執(zhí)行,到 main 函數(shù)結(jié)束而終止。
查看全部 -
#include <stdio.h>是什么意思?
在程序世界中,我們通常把外界將信息傳遞給我們的程序叫做輸入,我們程序向外界傳遞信息叫做輸出。
在程序中打印Hello World!,其實就是一個標準的輸出行為,因為程序向外界傳輸了信息,這個信息就是Hello World!。
main()函數(shù),沒錯,就是字面上看到的意思,主函數(shù),這是一個特殊的函數(shù),它是程序的入口函數(shù)。一個程序里,有且只有一個 main 函數(shù)。
向世界問好核心語句? printf("Hello World!\n");? 這句代碼的意思是向標準輸入輸出流中輸出一行 Hello World!,\n表示換行符。printf 這個功能在 stdio.h 中包含,這也就是為什么我們要在程序一開頭就 include 它的原因。
查看全部 -
printf("int:%d\n",sizeof(int));查看字節(jié)數(shù)目
查看全部 -
而在計算機中,存儲數(shù)據(jù)的方式就很像電報。其實計算機中,只能存放 0 和 1 兩種不同的信號,這也就是我們通常說的,計算機是二進制的。那么如何存放更復雜的數(shù)據(jù)呢?答案是排列組合。
那么如果我們將 8 個 bit 組合起來,通過排列組合,我們就可以得到 2 的 8 次方,也就是 256 個數(shù)字的數(shù)據(jù)容量。在計算機中,我們把 8 個 bit 的容量稱之為 1 個 byte, 中文叫做字節(jié)。8bit = 1 byte
整型又可以分為有符號和無符號兩個大類,這里的符號,指的其實就是正負號,有符號的數(shù)據(jù)類型,可以用來存放正數(shù)和負數(shù),而無符號的數(shù)據(jù)類型,只能用來存放正數(shù)。
通過觀察,我們可以發(fā)現(xiàn),有符號和無符號的數(shù)據(jù)容量其實是相同的,拿 char 和 unsigned char 來說,他們的容量都是 2 的 8 次方,也就是 256 個數(shù)。只不過?char 類型的范圍是 [-128, 127],而 unsigned char 類型的范圍是 [0, 255]。
每種數(shù)據(jù)類型最大的差別就是他們所占的空間大小不一樣,更大的數(shù)據(jù)類型擁有更大的容量,這也意味著他能裝得下更多的數(shù)字,或者更多的精度。
其實上面的表中的數(shù)據(jù)長度,只是一個常見的默認值,不同的機器會有不同的情況,C++ 標準中并沒有定義某一個數(shù)據(jù)類型必須占用多少個字節(jié)的長度,C++只定義了每種數(shù)據(jù)類型長度的一個范圍。short 要大于等于 char
int 要大于等于 short
long 要大于等于 int
long long 要大于等于 long
查看全部 -
我們可以通過 printf 向控制臺輸出內(nèi)容,也同樣可以使用控制臺向程序輸入內(nèi)容。輸入內(nèi)容,就需要用到一個函數(shù)scanf。
函數(shù)要有返回值
#include<stdio.h>
#include<iostream>
int main(int argc,char **argv)
{
? ? int a=0
? ? int b=0
? ? std::cin>>a>>b;
? ? return 0;
}
scanf_s 跟printf差不多, stdcout是輸出
stdcin是輸入
查看全部 -
const 數(shù)據(jù)類型 變量
查看全部 -
include <iostream>
int main(int argc,char **argv)
{
? ? std::cout << "Hello World!\n" << std::endl;
? ? return 0;
最后那個是endl
查看全部 -
std::cout << "Hello World!\n" << std::endl
查看全部 -
先打一拳的循環(huán):do while 循環(huán)
我們再來看看 do-while 循環(huán),語法如下:
do { } while(表達式 A)
可以發(fā)現(xiàn),do-while 和 while 是非常像的,不一樣的是,這里多了一個 do,而且 while 放到了后面。
而 do-while 和 while 最不一樣的地方,就是 do-while 無論條件是否成立,都會先執(zhí)行一次循環(huán)體內(nèi)的內(nèi)容。
do-while 是一種 while 的重要補充,由 while 的先判斷再循環(huán),變成先循環(huán)再判斷。
我們來看這樣一段程序
do { ? ? ... } while(false)
這段程序中,我們直接在 while 的判斷條件中寫了一個 false。那么我們這樣做了,事實上是無法構(gòu)成一個循環(huán)的。既然不是循環(huán),那么我們?yōu)槭裁匆@樣做呢?
因為我們這里要利用一個循環(huán)的語法,來實現(xiàn)非循環(huán)的用途。
我們在寫程序的時候,有時候會想要做一個跳過一段程序的功能。
if(a == 12){ ? ? // 執(zhí)行跳過語句 } b = a + b; b = a - b;
例如,在上面的程序中,如果我們想要實現(xiàn)這樣一個需求:當 a 等于 12 的時候,就跳過b = a + b;,直接執(zhí)行b = a - b;。如果 a 不等于 12,就依次執(zhí)行b = a + b; b = a - b;。
顯然,實現(xiàn)這樣一個功能,可以用 if 等的多分支結(jié)構(gòu):
if(a == 12){ ? ? b = a - b; } else{ ? ? b = a + b; ? ? b = a - b; }
但是當要跳過的語句有好多行的時候,就會顯得特別不方便。因此,我們可以嘗試利用 do-while 語法來完成。
do { ? ? if(a == 12){ ? ? ? ? break; ? ? } ? ? b = a + b; } while(false); b = a - b;
這樣,我們將 do-while 和 break 進行配合,完成一個和循環(huán)無關(guān)的程序結(jié)構(gòu)。
查看全部 -
指針和數(shù)組的姻緣
數(shù)組篇
在前面及小結(jié)中,我們學習了指針和數(shù)組的概念,看起來這是兩個完全不同的東西。但其實他們兩者是緊密相關(guān)的,本小結(jié)我們就來探討一下指針和數(shù)組的聯(lián)系。
我們在定義數(shù)組的時候,常常這樣定義,int arr[5];
在 C++ 中,數(shù)組表示的是一段連續(xù)的內(nèi)存存儲空間
如上圖,每個元素之間是沒有空隙的,這樣每個元素的內(nèi)存地址,其實也是有規(guī)律可循的??梢詫戇@樣一個程序,來驗證我們的想法:
#include <stdio.h> int main(int argc,char **argv) { ? ? int array[5]; ? ? printf("array[0]: %p\n", &array[0]); // %p 用來打印數(shù)組的地址 ? ? printf("array[1]: %p\n", &array[1]); ? ? printf("array[2]: %p\n", &array[2]); ? ? printf("array[3]: %p\n", &array[3]); ? ? printf("array[4]: %p\n", &array[4]); ? ? return 0; }
程序運行結(jié)果如下:
array[0]: 0x7ffee9d81490 array[1]: 0x7ffee9d81494 array[2]: 0x7ffee9d81498 array[3]: 0x7ffee9d8149c array[4]: 0x7ffee9d814a0
指針的地址以16進制的方式輸出,可以看出,這幾個地址中,每兩個相鄰的地址都相差 4 ,而每一個元素都是 int類型,int 占 4 個字節(jié)大小,說明他們確實是緊密相連的。
驗證了數(shù)組的地址之后,再來看看數(shù)組是如何訪問數(shù)組中的元素的。假設(shè)我們想要訪問第 2 個元素(從 0 開始)
array[1];
那么 C++ 在碰到這行代碼的時候,是先拿到第 2 個元素的地址,然后通過地址去訪問元素,那么如何拿到第二個元素的地址呢?剛剛的實驗證明,數(shù)組中元素的地址都是等差的,所以只要拿到第一個元素的地址,再加上相應元素的偏差,就可以拿到第二個元素的地址了。
那么,對于數(shù)組來說,第一個元素的地址是什么的?答案是數(shù)組名。
我們再嘗試寫一個測試程序
#include <stdio.h> int main(int argc,char **argv) { ? ? int array[5]; ? ? printf("array: %p\n", array); ? ? printf("array[0]: %p\n", &array[0]); // %p 用來打印數(shù)組的地址 ? ? printf("array[1]: %p\n", &array[1]); ? ? printf("array[2]: %p\n", &array[2]); ? ? printf("array[3]: %p\n", &array[3]); ? ? printf("array[4]: %p\n", &array[4]); ? ? return 0; }
程序運行結(jié)果如下:
array: 0x7ffeefa29490?
array[0]: 0x7ffeefa29490?
array[1]: 0x7ffeefa29494?
array[2]: 0x7ffeefa29498?
array[3]: 0x7ffeefa2949c?
array[4]: 0x7ffeefa294a0
我們發(fā)現(xiàn),直接輸出 array 和首元素的地址,是一模一樣的,那么就可以得出一個結(jié)論:數(shù)組名是一個指向數(shù)組首元素的指針
但是這個指針和我們常見的指針有一些不一樣的地方,這個指針是一個常量,所以我們是不可以對其進行修改的。也就是說,我們不能對其進行 array = p 或者 array++ 這樣包含重新賦值的操作,但是我們?nèi)匀豢梢杂弥羔樀挠梅▉聿僮魉?/p>
例如,使用指針的加減法來訪問對應的元素
#include <stdio.h> int main(int argc,char **argv) { ? ? int array[5]; ? ? *(array + 2) = 1; ? ? return 0; }
代碼中的?*(array + 2) = 1;?就等價于?array[2] = 1;
指針篇
我們在前面講過 malloc 分配內(nèi)存的用法。來看一個例子
#include <stdio.h> int main(int argc,char **argv) { ? ? int * p = (int *)malloc(5 * sizeof(int)); ? ? free(p); ? ? return 0; }
在上面的程序中,我們分配出來了一個 5 個 int 大小的儲存空間:
在這塊儲存空間內(nèi),可以存放 5 個 int 類型的數(shù)字,假如想要訪問第 2 個數(shù)字,我們可以寫*(p + 2)
那么指針可不可以按照數(shù)組的訪問方式去訪問呢?p[2]
其實也是可以的,p[2]和*(p + 2)在這里是等價的。
查看全部 -
定義結(jié)構(gòu)體的圖片查看全部
舉報