Day1.c語(yǔ)言初體驗(yàn)
- C語(yǔ)言中每一條語(yǔ)句后面都必須有;號(hào)
- C語(yǔ)言中除了""引起來(lái)的地方, 其它任何地方都不能出現(xiàn)中文
- main函數(shù)中的return 0;可以寫, 也可以不寫
- main函數(shù)前面的int可以寫, 可以不寫
- main函數(shù)后面的()不可以省略
- 不要把main寫錯(cuò)了
- 同一程序中只能有一個(gè)main函數(shù)
- 輸出函數(shù)printf("lnj;");
Day2.關(guān)鍵字
注釋的用法
- // 單行注釋
- /*
多行注釋 (以 /星 開頭 以 星/ 結(jié)尾)
*/ - 單行注釋可以嵌套多行注釋
- 單行注釋嵌套多行注釋的時(shí)候, 多行注釋必須在同一行內(nèi)
- 多行注釋可以嵌套單行注釋
- 多行注釋不能嵌套多行注釋
常量
// 1.整型常量
10;
// 2.實(shí)型常量(小數(shù))
// 單精度f(wàn)loat / 雙精度double
// 注意: 默認(rèn)情況下編寫的小數(shù)都是雙精度的實(shí)型常量, 也就是默認(rèn)情況下所有小數(shù)都是double
10.1;// 雙精度double
88.8;// 雙精度double
5.2f; //單精度f(wàn)loat
// 3.字符型常量, 用單引號(hào)括起來(lái)的就是字符型常量
// 注意: 字符型常量的單引號(hào)中只能寫一個(gè)字符, 如果寫多個(gè)會(huì)報(bào)錯(cuò)
'a'; // 字符型常量
'ab'; // 錯(cuò)誤
'1';
'12'; // 錯(cuò)誤, 12是由兩個(gè)字符組成, 由1和2組成
// '李'; // 錯(cuò)誤寫法, 因?yàn)橐粋€(gè)漢字占3個(gè)字節(jié)
// 字符型常量的特殊情況, 在C語(yǔ)言中, 系統(tǒng)給某些字符的組合定義了特殊的函數(shù), 這些字符的組合可以當(dāng)做單個(gè)字符來(lái)使用
'\n';
// 4.字符串型常量, 用雙引號(hào)括起來(lái)的就是字符串型常量
// 注意: 無(wú)論你用雙引號(hào)括起來(lái)了幾個(gè)字符, 只要使用雙引號(hào)括起來(lái)的都是字符串常量
"abc";
"a";
變量
// 1.申請(qǐng)一塊存儲(chǔ)空間, 也就是定義一個(gè)變量
/*
// 定義變量的格式: 數(shù)據(jù)類型 變量名稱;
// 定義一個(gè)基本數(shù)據(jù)類型的變量
// int float double char
int number; // 定義了一個(gè)名稱叫做number的變量
// 會(huì)在內(nèi)存中開辟一塊存儲(chǔ)空間給number, 用于存儲(chǔ)數(shù)據(jù)
*/
/*
// 2.連續(xù)定義, 如果多個(gè)變量都是相同類型的, 那么可以采用連續(xù)定義
int number, value;
// 3.如何往變量對(duì)應(yīng)的存儲(chǔ)空間當(dāng)中存儲(chǔ)數(shù)據(jù)
// 注意: 變量中不能隨便存儲(chǔ)數(shù)據(jù), 只能存儲(chǔ)與之對(duì)應(yīng)的數(shù)據(jù)
// 概念: 變量的第一次賦值, 我們稱之為初始化,
// 注意, 要想使用變量都必須先對(duì)變量進(jìn)行初始化, 然后才能夠使用
// 如果不對(duì)變量進(jìn)行初始化, 那么其實(shí)變量中存儲(chǔ)的是一些垃圾數(shù)據(jù)
number = 10; // 會(huì)將等號(hào)右邊的數(shù)據(jù)放到等號(hào)左邊的變量對(duì)應(yīng)的存儲(chǔ)空間中
// 4.如何使用變量
// 占位符號(hào), %號(hào)是占位符號(hào)的起始符號(hào)
printf("%i\n", number);
float floatValue; // 定義了一個(gè)實(shí)型的變量
floatValue = 10.1f; // 往floatValue對(duì)應(yīng)的存儲(chǔ)空間中存儲(chǔ)了10.1這個(gè)值
printf("%f\n", floatValue);
int intValue, age; // 定義了一個(gè)整型的變量
printf("%i\n", intValue);
printf("%i\n", age);
*/
// 6.初始化的兩種方式
/*
// 1.先定義再初始化
int number;
number = 10;
// 2.定義的同時(shí)初始化
int value = 10;
*/
// 7.完全初始化
// int number, value;
// number = value = 10;
int number;
number = 10;
int value;
value = number;
// 8.部分初始化
// int number, value = 10;
// 內(nèi)存尋址從大到小, 如果按照這種規(guī)則, 那么先定義的變量?jī)?nèi)存地址一定大于后定義的變量
int number = 0;
int value = 0;
// 如何獲得變量的詳細(xì)地址(變量的地址), &變量名稱
// 利用%p占位符來(lái)打印變量的詳細(xì)地址
// 輸出的是一個(gè)十六進(jìn)制的數(shù)
printf("%p\n", &number);
printf("%p\n", &value);
printf和scanf函數(shù)
- printf函數(shù):
// 1.輸出基本數(shù)據(jù)類型
/*
int number = 10;
int value = 20;
printf("%i, %i\n", number, value);
float floatValue = 10.1f;
printf("%f\n",floatValue);
char charValue = 'a';
printf("%c\n", charValue);
double doubleValue = 9.9;
printf("%lf", doubleValue);
*/
// 3..指定位寬
// int number = 99;
// printf("%5i!!!", number); 這個(gè)是右對(duì)齊 左邊補(bǔ)3個(gè)空格
// printf("%-5i!!!", number);這個(gè)是左對(duì)齊 右邊補(bǔ)3個(gè)空格
int number = 9999;
printf("%2i", number);這個(gè)是位寬不夠自動(dòng)升級(jí) 正常輸出9999
/*
// 如何指定位寬? %mi; // 其中m就是位寬 而i輸出對(duì)應(yīng)類型的數(shù)據(jù)
// 默認(rèn)情況下位寬是右對(duì)齊, 如果需要輸出的類型寬度不夠, 會(huì)在左邊補(bǔ)空格
// 如果在位寬前面加上-號(hào), 就會(huì)改變位寬的對(duì)齊方式為左對(duì)齊,如果需要輸出的類型寬度不夠,會(huì)在右邊補(bǔ)空格
// 注意: 如果指定了位寬, 但是實(shí)際輸出的內(nèi)容超出了寬度, 會(huì)按照實(shí)際的寬度來(lái)輸出
// 可以在位寬前面加上0, 如果輸出的內(nèi)容寬度不夠就會(huì)用0來(lái)補(bǔ), 如果寬度已經(jīng)夠了, 那么會(huì)按照實(shí)際的寬度輸出
int number = 8;
// 01
// 2015-06-05
printf("%02i", number);這個(gè)輸出08
*/
// 3.保留位數(shù)
/*
// %f默認(rèn)會(huì)保留6位小數(shù)
// 指定保留多少位小數(shù): %.nf, 其中n就是需要保留多少位小數(shù), f用于輸出實(shí)型
float floatValue = 3.14;
printf("%.2f", floatValue);
*/
// 4.%f各種坑
/*
// 為什么指定保留10位之后還不對(duì)呢? 因?yàn)閒loat類型有效位數(shù)是7位(不包括小數(shù)點(diǎn))
// 如何計(jì)算有效位? 從第一個(gè)數(shù)開始計(jì)算
// 如果輸出的數(shù)據(jù)超出了有效位數(shù), 那么就會(huì)出現(xiàn)一些垃圾數(shù)據(jù)
float floatValue = 3.1415926525;
printf("%.10f\n", floatValue); // 默認(rèn)情況保留6位
這個(gè)輸出:3.1415927410 保留6位 然后第七位四舍五入
// 如何想完整的輸出那么必須將數(shù)據(jù)保存位double類型, 因?yàn)閐ouble類型的有效位是15位
double doubleValue = 3.1415926525;
printf("%.10lf\n", doubleValue);
這個(gè)輸出:3.1415926525
*/
// 5.如何提高比格
float floatValue = 3.1415926;
printf("%.*f", 5,floatValue);
- scanf函數(shù)
// 1.要求: 存儲(chǔ)用戶輸入的整數(shù)
/*
// 1.用戶輸入的整數(shù)確定嗎? 不確定 --> 定義變量
// 2.如何接收用戶輸入的整數(shù)? scanf函數(shù)
// scanf格式: scanf("格式化字符串", 列表項(xiàng)); --> scanf("%i", 變量);
// 1.定義變量
int number;
// 2.利用scanf函數(shù)接收用戶輸入的數(shù)據(jù)
scanf("%i", &number);// 注意: 必須告訴scanf函數(shù)變量的詳細(xì)地址, 才能存儲(chǔ)用戶輸入的數(shù)據(jù)
// 3.輸出接收到的數(shù)據(jù)
printf("number = %i", number);
*/
// 2.要求從控制臺(tái)接收用戶輸入的兩個(gè)整數(shù), 然后計(jì)算兩個(gè)整數(shù)的和
/*
// 0.提示用戶輸入數(shù)據(jù)
printf("親, 請(qǐng)輸入第一個(gè)數(shù)字, 以回車鍵結(jié)束\n");
// 1.定義兩個(gè)變量保存用戶輸入的數(shù)據(jù)
int num1, num2;
// 2.利用scanf接收用戶輸入的數(shù)據(jù)
// 2.1接收第一個(gè)數(shù)
scanf("%i", &num1);
printf("親, 請(qǐng)輸入第二個(gè)數(shù)字, 以回車鍵結(jié)束\n");
scanf("%i", &num2);
// 3.將接收到的兩個(gè)數(shù)相加
int result = (num1 + num2);
// 4.輸出兩個(gè)數(shù)驗(yàn)證結(jié)果
printf("result = %d", result);
*/
/*
int num1, num2;
num1 = num2 = 10;
printf("num1 = %i, num2 = %i", num1, num2);
*/
/*
// 0.提示用戶輸入數(shù)據(jù)
printf("親, 請(qǐng)輸入兩個(gè)數(shù)字, 以回車鍵結(jié)束\n");
// 1.定義兩個(gè)變量保存用戶輸入的數(shù)據(jù)
int num1, num2;
// 2.利用scanf接收用戶輸入的數(shù)據(jù)
// 注意: 利用scanf接收多個(gè)數(shù)據(jù)的時(shí)候, 輸入的內(nèi)容要求和"格式化字符串"中的一模一樣
// 如果輸入的數(shù)據(jù)與格式化字符串中的不匹配, 那么scanf函數(shù)會(huì)自動(dòng)終止
// scanf("%i,%i", &num1, &num2);
//如果多個(gè)數(shù)據(jù)之間沒(méi)有其它字符, 那么可以利用 空格, 回車, table來(lái)作為分隔
// 但是, 如果格式化字符串中有%c除外
// scanf("%i%i", &num1, &num2);
char charValue;
// 輸入: 123-->num1, a -->charValue, 456-->num2
// 技巧: 無(wú)論想接收什么類型的數(shù)據(jù), 只要有需要一次性接收多個(gè), 就給每一個(gè)數(shù)據(jù)之間加上固定的符號(hào)作為分隔符(例如: ,)
scanf("%i-%c-%i", &num1, &charValue, &num2);
// 3.將接收到的兩個(gè)數(shù)相加
// int result = (num1 + num2);
// 4.輸出兩個(gè)數(shù)驗(yàn)證結(jié)果
// printf("result = %d", result);
printf("num1 = %i, char = %c , num2 = %i", num1, charValue, num2);
*/
// 3.\n問(wèn)題
int number, number2;
// \n代表?yè)Q行
// 如何告訴scanf函數(shù)我們輸入完畢? 回車 == \n
// 因?yàn)榛剀囀莝canf的結(jié)束符, 所以不能在scanf的格式化字符串末尾寫上\n
// 如果不小心把\n放到了scanf格式化字符串的末尾, 也可以破, 原樣輸入或輸入一個(gè)不匹配的類型
scanf("%i\n%i\n", &number, &number2);//這個(gè)分割符千萬(wàn)不要用\n,不能出現(xiàn)
printf("number = %i , number2 = %i\n", number, number2);
Day3.運(yùn)算符及if
運(yùn)算
- 類型轉(zhuǎn)換
自動(dòng)類型的提升, 將參與運(yùn)算的數(shù)據(jù)都轉(zhuǎn)換為同一類型后再運(yùn)算,會(huì)自動(dòng)將小的數(shù)據(jù)類型提升為大的數(shù)據(jù)類型。
// 在算術(shù)運(yùn)算中, 參與運(yùn)算的是什么類型, 計(jì)算出來(lái)就是什么類型
// double result = 1.0 / 2; // 1.0 / 2.0 --> 0.5
// double result = (double)1 / 2;// 1.0 / 2.0 --> 0.5
double result = (double)(1 / 2); // (double)(0) --> 0.0
printf("result = %lf\n", result);
*/
- 運(yùn)算符(主要注意%)
// 注意: 取模運(yùn)算只能用于整數(shù)
// result = 10.0 % 3.0;錯(cuò)誤
// 取模運(yùn)算的正負(fù)性取決于左邊的操作數(shù), 如果左邊為負(fù)數(shù), 那么結(jié)果就是負(fù)數(shù)
// result = 10 % -3;結(jié)果 1
// result = -10 % -3;結(jié)果 -1
// result = -10 % 3;結(jié)果 -1
// 如果取模運(yùn)算的左邊小于右邊, 那么結(jié)果就是左邊
// result = 2 % 9; 結(jié)果2
總結(jié)一句話: ++在前, 先自增再運(yùn)算, ++在后, 先運(yùn)算再自增
- sizeof簡(jiǎn)介(主要用來(lái)運(yùn)算字節(jié)數(shù))
- sizeof可以用來(lái)計(jì)算一個(gè)變量或一個(gè)常量、一種數(shù)據(jù)類型所占的內(nèi)存字節(jié)數(shù)
- 注意: sizeof是一個(gè)運(yùn)算符, 不是一個(gè)函數(shù)利用sizeof計(jì)算的格式: sizeof(變量/常量/數(shù)據(jù)類型);
- 逗號(hào)運(yùn)算符
// 逗號(hào)運(yùn)算符的結(jié)果是 最后一個(gè)表達(dá)式的結(jié)果
int a = 10;
int b = 5;
// 6 a = 10 + 5 = 15 b = 5 + 1 = 6
int result = ((a = a + 5), (b = b + 1)); // 僅僅作為了解
printf("a = %i, b = %i, result = %i\n", a, b, result);
結(jié)果15, 6, 6
- 三目運(yùn)算符格式: 條件表達(dá)式 ? 結(jié)果A : 結(jié)果B
// 結(jié)合性: 從左至右
// 只要條件表達(dá)式為真就返回結(jié)果A, 如果條件表達(dá)式為假, 那么就返回結(jié)果B
// a大于b嗎? 如果a大于b就返回a, 否則返回b
// int result = (a > b)? a : b;
// arc4random_uniform方法會(huì)根據(jù)傳入的整數(shù)生產(chǎn)一個(gè)隨機(jī)數(shù)
// 生成的值就是 0~(N-1)的值
int cmp = arc4random_uniform(3);