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