#include <cstdio> //頭文件,主要負責輸入、輸出 using namespace std;//C++標準程序庫中的全部標識符都被定義於一個名爲std,注意後面的";" int main(){//主程序,程序的開始,一個程序只能有一個主程序,格式固定 printf("Hello,world!\n");//printf是一個輸出語句,功能定義在cstdio文件,名字定義在std return 0;//固定格式,和int對應,正確執行,返回值0 }
上面代碼是寫給程序員看的叫源程序,但計算機並看不懂,因此咱們要對上面的代碼進行編譯,編譯錯誤說明咱們沒有按照語法規則寫代碼,須要修改,編譯成功,說明沒有語法錯誤,Dev會把源程序轉換成計算可以'讀懂'的目標程序,而後咱們執行目標程序,計算機就能照咱們要求辦事了。c++
程序在運行的時候須要把數據都存儲在計算機的內存中,內存中的是由一個個基本的存儲單元組合而成,每個存儲單元大小是一個字節,每個存儲單元都有一個內存地址,這個內存地址是一個很長的十六進制數,爲了便於操做,咱們用一個字符串來表明這些內存地址,咱們對變量的操做,就至關於在變量所在的內存地址裏存儲或取出數據,這些數據是可變的,因此咱們稱之爲變量。程序員
c++中的數據必須有其數據類型,經常使用的基本數據類型有整形、浮點型、字符型、布爾型。每一種數據類型都有本身的數據範圍和在內存中存儲大小。函數
類型 | 關鍵字 | 格式控制符 | 存儲(字節) | 範圍 |
---|---|---|---|---|
短整型 | short int | %hd | 2 | \(-2^{15}\)~\(2^{15}-1\) |
無符號短整型 | unsigned short int | %hu | 2 | \(0\)~\(2^{16}-1\) |
整型 | int | %d | 4 | \(-2^{31}\)~\(2^{31}-1\) |
無符號整型 | unsigned int | %u | 4 | \(0\)~\(2^{32}-1\) |
長整型 | long long | %lld | 8 | \(-2^{63}\)~\(2^{63}-1\) |
無符號長整型 | unsigned long long | %llu | 8 | \(0\)~\(2^{64}-1\) |
單精度浮點型 | float | %f | 4 | 6~7位有效位數 |
雙精度浮點型 | double | %lf | 8 | 15~16位有效數 |
長雙精度浮點型 | long double | %llf | 16 | 18~19位有效數 |
字符型 | char | %c | 1 | |
布爾型 | bool | 無 | 1 | c++有,c無 |
用於爲變量分配存儲空間,還可爲變量指定初始值。變量在使用前必需要定義。spa
int a;//定義一個變量名叫a的變量,這個變量在內存裏佔據4個字節的存儲單元,此內存單元內可能有其餘程序結束後留下的數據,因此初值不固定,通常須要初始化。 double b;//定義一個雙精度浮點變量b,佔8個字節的存儲單元 float a;//錯誤,變量a已存在,不能重複定義 float int;//錯誤,int位系統關鍵字不能做爲變量名
c語言格式化輸入輸出:scanf、printf3d
- 須要包含頭文件
- 是格式化輸入輸出,每一種數據類型都有其格式控制符,必須嚴格對應
- 書寫比較麻煩,但聯賽建議你們使用,由於其比輸入輸出流要快。
- 函數原型:int scanf(const char *format,...);
- 函數返回值:成功格式化解析的格式。
- 調用格式:scanf(" <格式化字符串> ", <地址列表> );
- 注意格式控制符和地址列表要一一對應
int a,b,c;//定義三個整型變量a,b,c c=scanf("%d%d",&a,&b);//格式化字符串要用雙引號引發來,注意取地址符&
- "*"符:用以表示該輸入項,讀入後不賦予相應的變量,即跳過該輸入值。
scanf("%d%*d%d",&a,&b);//輸入1 2 3時,1賦予a,3賦予b,2被跳過
- 寬度:用十進制整數指定輸入的寬度(即字符數)。
scanf("%3d%3d",&a,&b);//輸入12345678時,a=123,b=456
- 在輸入多個數值數據時,格式控制串中的間隔則可用空格,TAB做間隔
scanf("%d%d",&a,&b); scanf("%d %d",&a,&b); scanf("%d %d",&a,&b); //以上三種方式同樣的,都可
- 若是格式控制串中有非格式字符則輸入時也要輸入該非格式字符。
scanf("%d,%d",&a,&b);//輸入時兩個數之間也必須用","隔開,如:12,13
- 如輸入的數據與輸出的類型不一致時,雖然編譯可以經過,但結果將不正確
scanf("%d%d",&a,&b);//輸入:12 ab時,a=12而b的值不正確
- 函數原型:int printf(const char *format,[argument]);
- 函數返回值爲整型。若成功則返回輸出的字符數,輸出出錯則返回負值。
- 調用格式:printf(" <格式化字符串> ", <參量表> );
- 要求格式字符串和各輸出項在數量和類型上應該一一對應
int a,b,c;//定義三個整型變量 scanf("%d%d%d",&a,&b,&c);//從鍵盤輸入三個整數分別賦給a,b,c printf("%d %d %d",a,b,c);//輸出三個變量,用空格隔開,注意變量列表和地址列表的區別
- 非格式字符串原樣輸出,在顯示中起提示做用。
printf("a=%d b=%d c=%d",a,b,c);//非格式字符都會原樣輸出
- 轉義字符
printf("%d %d %d\n",a,b,c);//"\n"是轉義字符,表示換行
- 場寬,即輸出的最小寬度,變量值寬度超過最小場寬,用實際寬度顯示
printf("%5d %6d\n",a,b);//變量a,b輸出最少佔5個字符,不夠左邊補格 prinf("%-5d %6d\n",a,b);//變量a最少佔5個字符,不夠右邊補空格,b同上 printf("%5d %5d\n",a,b);//若是a或b自己超過了5個字符,則按實際寬度輸出
- 精度,即實數保留的小數位數
float x,y; printf("%5.2f %5.2\n",x,y);//5表示場寬,同上,.2表示保留2位小數位 printf("%-5.2f\n",x);//不夠5位(包括小數點),右邊補空格
語法:變量=表達式code
- 賦值語句的左邊必須是變量,左邊是表達式。eg:a=a+b*c+3;
- 賦值語句是先把右邊的表達式運算出一個具體的值,而後把這個值存儲在左邊變量所申請的內存地址裏
- 因爲賦值運算符「=」右邊的表達式也能夠是賦值表達式,所以, 變量=變量=…=表達式;是成立的。eg:a=b=c=5;
- 若是左邊的變量類型和右邊的表達式求出的結果類型不一致,將把右邊的值轉換成左邊的類型再賦值。
假設變量A=10,B=20orm
運算符 | 描述 | 實例 |
---|---|---|
+ | 把兩個操做數相加 | A + B 將獲得 30 |
- | 從第一個操做數中減去第二個操做數 | A - B 將獲得 -10 |
* | 把兩個操做數相乘 | A * B 將獲得 200 |
/ | 分子除以分母 | B / A 將獲得 2 |
% | 取模運算符,整除後的餘數 | B % A 將獲得 0 |
++ | 自增運算符,整數值增長 1 | A++ 將獲得 11 |
-- | 自減運算符,整數值減小 1 | A-- 將獲得 9 |
- 兩整數相除,答案是其商,也爲整數.eg: 3/2 結果爲:1
- 除數或被除數有一個爲實數,答案爲實數eg:3.0/2 結果爲:1.5
- %只能對整數取餘.eg:3%2 結果爲:1
- 自加、自減運算
int a,b,i=1; a=i++;//變量i先把本身的值賦值給變量a,而後i本身加1,變成2,因此a==1,i==2 b=++i;//變量i先把本身加1變成3,而後把值賦值給變量b,因此b==3,i==3 //i--;--i;同上
下表顯示了 C++ 支持的關係運算符。假設變量 A = 10,變量 B=20,則:內存
運算符 | 描述 | 實例 |
---|---|---|
== | 檢查兩個操做數的值是否相等,若是相等則條件爲真。 | (A == B) 不爲真。 |
!= | 檢查兩個操做數的值是否相等,若是不相等則條件爲真。 | (A != B) 爲真。 |
> | 檢查左操做數的值是否大於右操做數的值,若是是則條件爲真。 | (A > B) 不爲真。 |
< | 檢查左操做數的值是否小於右操做數的值,若是是則條件爲真。 | (A < B) 爲真。 |
>= | 檢查左操做數的值是否大於或等於右操做數的值,若是是則條件爲真。 | (A >= B) 不爲真。 |
<= | 檢查左操做數的值是否小於或等於右操做數的值,若是是則條件爲真。 | (A <= B) 爲真。 |
下表顯示了 C++ 支持的關係邏輯運算符。假設變量 A = 1,變量 B = 0,則:字符串
運算符 | 描述 | 實例 |
---|---|---|
&& | 稱爲邏輯與運算符。若是兩個操做數都非零,則條件爲真。 | (A && B) 爲假。 |
|| | 稱爲邏輯或運算符。若是兩個操做數中有任意一個非零,則條件爲真。 | (A || B) 爲真。 |
! | 稱爲邏輯非運算符。用來逆轉操做數的邏輯狀態。若是條件爲真則邏輯非運算符將使其爲假。 | !(A && B) 爲真。 |
整數常量能夠是十進制、八進制或十六進制的常量。前綴指定基數:0x
或 0X
表示十六進制,0
表示八進制,不帶前綴則默認表示十進制。原型
整數常量也能夠帶一個後綴,後綴是 U
和 L
的組合,U
表示無符號整數 unsigned
,L
表示長整數 long int
。後綴能夠是大寫,也能夠是小寫,U 和 L 的順序任意。
下面列舉幾個整數常量的實例:
212 //合法的 215u //合法的 0xFeeL //合法的 078 //非法的:8 不是八進制的數字 032UU //非法的:不能重複後綴
浮點常量由整數部分、小數點、小數部分和指數部分組成。
浮點型常量有多種寫法。其基本形式是首先寫整數部分(能夠帶符號),接着寫小數部分,而後寫 e
或者 E
,最後再寫一個有符號整數
e
或 E
被稱爲階碼標誌,e
或 E
後面的有符號整數被稱爲階碼。階碼錶明 10 的階碼次方。\(eg: 1.2E+5\) 等價與\(1.2*10^5\) 。
下面列舉幾個浮點常量的實例:
3.14159 // 合法的 3.14159e+5 // 合法的,等價與 3.14159*10^(5) 3.14159e5 // 合法的,等價與 3.14159*10^(5),能夠省略'+' 314159E-5 // 合法的,等價與 314159*10^(-5)
字符串常量
字符常量是括在單引號中,例如,'x'能夠存儲在 char 類型的簡單變量中。
字符常量能夠是一個普通的字符(例如 'x')、一個轉義序列(例如 '\t'),或一個通用的字符(例如 '\u02C0')。
在 C 中,有一些特定的字符,當它們前面有反斜槓時,它們就具備特殊的含義,被用來表示如換行符(\n)或製表符(\t)等。
下表列出了一些這樣的轉義序列碼:
轉義序列 | 含義 |
---|---|
\|\ | |
' | ' |
" | " |
? | ? |
\a | 報警鈴聲 |
\b | 退格鍵 |
\f | 換頁符 |
\n | 換行符 |
\r | 回車 |
\t | 水平製表符 |
\v | 垂直製表符 |
\ooo | 一到三位的八進制數 |
\xhh | 一個或多個數字的十六進制數 |
下面的實例顯示了一些轉義序列字符:
#include <cstdio> int main() { printf("Hello\tWorld"); return 0; }
#define
預處理器,也叫宏定義。#define 常量名 常量表達式 eg: #include <cstdio> #define LENGTH 10 #define WIDTH 5 #define add(x,y) (x+y)//注意要加括號否則會出現 #define NEWLINE '\n' int main() { int area; area = LENGTH * WIDTH; printf("value of area : %d\n", area); printf("%c\n", NEWLINE); printf("%d\n", 5*add(LENGTH,WIDTH));//若是不加括號會有意外驚喜 return 0; }
const
關鍵字。您可使用 const 前綴聲明指定類型的常量,以下所示:
const 數據類型 變量名 = 常量表達式;
一個表達式中出現不一樣類型間的混合運算,較低類型將自動向較高類型轉換。
不一樣數據類型之間的差異在於數據的表示範圍及精度上,通常狀況下,數據的表示範圍越大、精度越高,其類型也越「高級」。
整型類型級別從低到高依次爲:
int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long
浮點型級別從低到高依次爲:
float -> double
操做數中沒有浮點型數據時:
橾做數中有浮點型數據時:
當操做數中含有浮點型數據(float 或 double)時,全部操做數都將轉換爲 double 型。
3+5.3f+1.7 //算術表達式中操做數 1.7 爲雙精度浮點數,故先把 3 和單精度浮點數 5.3 自動提高爲雙精度浮點數後,參與運算。運算結果爲雙精度浮點數 10.0。
賦值運算符兩惻的類型不一致時:
當賦值運算符的右值(可能爲常量、變量或表達式)類型與左值類型不一致時,將右值類型可能提高或下降爲左值類型
右值超出左值類型範圍時:將把該右值截斷後,賦給左值。
double d=5.1f;//右值單精度浮點型常量 5.1 提高爲雙精度浮點型後,再賦值給 d int i=5.1; //右值雙精度浮點型 5.1 下降爲左值整型,即 5.1 捨棄小數部分後,把 5 賦給整型變量 i,這種狀況會丟失精度 char c; //char 佔8位,表示範圍-127〜128 c=1025; //1025 對應二進制形式:100 0000 0001,超出了8位,因此c爲1
當 return 後的表達式類型與函數的返回值類型不一致時,也會自動把 return 後表達式的值轉換爲函數類型後,再返回。
當函數調用時,所傳實參與形參類型不一致時,也會把實參自動轉換爲形參類型後再賦值。
雖然自動類型轉換不須要人工干預,使用方便,但有利也有弊,尤爲當自動類型轉換是從較高類型轉換爲較低類型時,將會下降精度或截斷數據,可能得不到預期的結果。
其通常形式爲: (類型說明符) (表達式)
表達式若是隻有一個變量能夠省略小括號
#include <cstdio> int main() { int sum = 17, count = 5; double mean,ans; mean = (double) sum / count;//把變量sum強制轉換成實數 ans = (double) (sum + count)/2;//先計算sum+count的值,而後把int型結果抓成double printf("Value of mean : %f\n", mean ); }
類型轉換隻是臨時性的,不管是自動類型轉換仍是強制類型轉換,都只是爲了本次運算而進行的臨時性轉換,轉換的結果也會保存到臨時的內存空間,不會改變數據原本的類型或者值
經常使用的算術轉換是隱式地把值強制轉換爲相同的類型。若是操做數類型不一樣,則它們會被轉換爲下列層次中出現的最高層次的類型