1-數據類型-常量-變量
1.1符號常量
#include<stdio.h>
//1-符號常量
#define PI 3+2 //不用在最后加分號
int main()
{
int i = PI * 2; //i就是一個整形變量 變量i是4個字節
printf("i=%d\n", i);
printf("i size=%d\n", sizeof(i)); //sizeof用來計算變量i的大小
return 0;
}
//最終輸出結果是7,原因是符號常量PI是直接替換的效果,因此不可以寫成PI=8
1.2float-浮點型常量
//浮點型常量
/* 表示方法:
小數形式:0.123
指數形式:3e-3(為3*10-3次方 即0.003)
注意:字母e(或E)之前必須有數字,且e后面的指數必須為整數.
正確示例:1e3 1.8e-3 -123e-6
錯誤示例:e3 2.1e3.5 .e3
通過float來定義浮點型變量 f占用4個字節空間大小
*/
#include<stdio.h>
int main()
{
float f = 3e-3;
printf("f=%f\n", f);//字符型使用%f來進行輸出
return 0;
}
1.3字符型數據
使用單引號括起來的一個字符是字符型常量,且只能包含一個字符! 例如:'a' 'A' '1' ' '是正確的字符型常量,而'abc' "a" " "是錯誤的字符型常量
轉義字符:\n 表示換行 \b 表示退格 \ 表示反斜杠
1.4字符變量
/*字符型變量 大寫字符轉換小寫字符*/
#include<stdio.h>
int main()
{
char c = 'A';
char b = 'a';
printf("%c\n", c + 32);//大寫轉換成小寫字符 以字符形式輸出
printf("%c\n", b - 32);//小寫轉換成大寫字符
printf("%d\n", c);//以數值形式輸出
return 0;
}
1.5字符串型常量
字符串型常量是由一對雙引號括起來的字符序列.例如'a'是字符型常量,"a"是字符串常量.兩者是不同的 在C語言中規定在每個字符串常量的結尾加一個字符結束標志,以便系統據此判斷字符串是否結束.C語言規定以"\0"作為字符串結束標志.因此在計算字符串占用的內存單元時要加上\0.例如"CHINA"占用的不是5個字符,而是6個字符,大小為6個字節
2-混合運算-printf講解
2.1 混合運算-強制類型轉換場景
整數進行觸發運算時,如果運算結果為小數,那么存儲浮點數時一定要進行強制類型轉換
#include<stdio.h>
//強制類型轉換
int main()
{
int i = 5;
float f = i / 2;//以整數輸出 這里做的是整型運算,因為左右操作數都是整型
float k = (float)i/2;//強制類型轉換 以小數輸出
printf("%f\n", f);
printf("%f\n", k);
return 0;
}
2.2 printf函數的介紹
printf函數可以輸出各種類型的數據,包括整型、浮點型、字符串型等,實際原理是printf函數將這些類型的數據格式化為字符串后,放入標準輸出緩沖區,然后將結果顯示在屏幕上
語法:
#include<stdio.h>
/* %c:輸出字符 %d:輸出帶符號的整數 %s:輸出一串字符 %f:輸出浮點數即小數*/
//語法:int printf(const char* format, ...);
int main()
{
int age = 21;
printf("Hello %s,you are %d years old\n", "Bob", age);
//%s表示在該位置插入首個參數(一個字符串),%d表示第二個參數(一個整數)應該放在那里.
int i = 1001;//第一次定義了i
float f = 96.3;
printf("student number = %3d,score = %5.2f\n", i, f);//3d表示輸出結果占三個空格
i = 100;//第二次不用定義i直接使用第一次定義的就可以
f = 98.21;
printf("student number = %-3d,score = %5.2f", i, f);//.2表示小數點后保留兩位 -3d表示向左對齊三個空格
return 0;
}
3-整型進制轉換
/*在計算機中,1字節(byte)為8位(bbit),1位即二進制的1位,它存儲0和1,int型常量的大小是4字節,即32位
二進制 0和1 轉八進制(每三個數為一位)
十進制 0-9 123 轉十六進制 123/16 =7..11(11在十六進制里面就是b)=7b 就是用這個十進制數除16 轉八進制就除八
八進制 0-7 轉二進制 例如:173 =1*8*8+7*8+3=64+56+3=123
十六進制0-9 a-f
1KB = 1024字節(byte)
1MB = 1024KB
1GB = 104MB
*/
#include<stdio.h>
int main()
{
int i = 123;//一般賦值都是十進制 八進制 十六進制 沒有二進制一說
//int i = 0123;//八進制賦值
//int i = 0x7b;//十六進制賦值
printf("%d\n", i);//以十進制輸出 化為二進制使用短除法(除2)
printf("八進制=%o\n", i);//一八進制輸出
printf("十六進制=%x\n", i);//一十六進制輸出
return 0;
}
//為什么顯示結果為7b 00 00 00 呢? 原因是英特爾的CPU采用了小端方式進行數據存儲,因此低位在前,高位在后
4-scanf函數的標準輸入
scanf函數的原理
/*scanf函數讀取標準輸入 scanf %d %f 發現里邊有\n 空格,忽略
scanf %c 不忽略內容
*/
#include<stdio.h>
#pragma warning(disable:4996)
//scanf用來讀取標準輸入,scanf把標準輸入內的內容,需要放到某個變量空間里,因此變量必須取地址
int main()
{
int i;
char c;
float f;
scanf("%d", &i); //一定要取地址
printf("i=%d\n", i);
rewind(stdin);//清空標準輸入緩沖區寫在兩個scanf函數之間 如果不寫該函數的話在執行結果時控制臺直接輸出兩個結果 在visualStdio2022環境中將fflush改成rewind
//fflush(stdin); //清除標準輸入緩沖區 在CMakeLists環境中使用,在visaolstdio環境不起作用
scanf("%c", &c);//如果沒有寫rewind(stdin)函數,這一步就會阻塞
printf("c=%c\n", c);
scanf("%f", &f);
printf("f=%f", f);
return 0;
}
出現如下的執行結果是沒有將上面的rewind(stdin)函數打開,此時scanf("%c",&c)會阻塞,原因是我們向標準輸入緩沖區中放入字符為'20\n',輸入'\n'(回車)后,scanf函數才開始匹配,scanf函數中的%d匹配整數20,然后放入變量i中,接著打印輸出,這是'\n'仍然在標準輸入緩沖區(stdin)內,如果第二個scanf函數為scanf("%d",&i),那么依然會發生阻塞,因為scanf函數在讀取整型數、浮點數、字符串時會忽略\n(回車)、空格等字符(忽略是指scanf函數執行時會首先刪除這些字符,然后在阻塞).scanf函數匹配一個字符時,會在緩沖區刪除對應的字符.因為在執行scanf("%c",&c)語句時,不會忽略任何字符,所以scanf("%c",&c)讀取了還在緩沖區中殘留的'\n'.總的來說就是%d %f輸出是不用寫rewind(stdin)函數會阻塞 而用%c輸入時要加rewind(stdin)函數


scanf混合輸入多種數據局類型
#include<stdio.h>
#pragma warning(disable:4996)
//scanf一次讀取多種數據類型
int main()
{
int i, ret;
float f;
char c;
ret = scanf("%d %c%f", &i, &c, &f); // ret是scanf匹配成功的個數
printf("i=%d,c=%c,f=%5.2f\n", i, c,f);
return 0;
}
5-運算符與表達式
5-1 算術運算符與關系運算符的使用
#include<stdio.h>
int main()
{
int a;
while(scanf("%d",&a))
{
if (3 < a && a < 10)//a大于3同時a小于10要這樣寫
{
printf("a is between 3 and 10\n");
}
else
{
printf("a is not between 3 and 10\n");
}
}
return 0;
}
5-2 邏輯運算符與賦值運算符,求字節運算符
#include<stdio.h>
#include<stdlib.h>
#pragma warning(disable:4996)
//判斷閏年
int main()
{
int year;
while(1)
{
printf("請輸入你要查詢的年份:\n");
scanf("%d", &year);
if(year%4==0&&year%100!=0 ||year%400==0)
{
printf("%d is lead year\n",year);
}
else
{
printf("%d is not lead year\n",year);
}
}
return 0;
}
短路運算
#include<stdio.h>
#include<stdlib.h>
//邏輯與和邏輯或 短路運算
int main()
{
int i = 0; // 0 表示假 1表示真
i&& printf("you can't see me !\n");//短路運算 :當i為假時,不會執行邏輯與后的表達式,稱為短路運算
i = 0;
i || printf("you can see me !\n");
//相當于if判斷條件的真假
/*if(i)
{
printf("you can't see me !\n");
}
else
{
}*/
return 0;
}
加后賦值與乘后賦值運算符使用
#include<stdio.h>
//加后賦值與乘后賦值用法
int main()
{
int a = 1, b = 2;
a += 3; //a = a + 3; //正確寫法
b *= 5; // b = b*5;
//b + 2 = a;// 錯誤寫法
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}
求字節運算符
#include<stdio.h>
#include<stdlib.h>
//sizeof實際是一個運算法,很多人會將它認為是函數 他不是函數
int mian()
{
int i;
printf("i is %d\n", sizeof(i));
return 0;
}
6選擇--循環
if -else語句
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
while(1)
{
scanf("%d", &i);
if(i>0)//良好的編程習慣,在if下邊使用大括號 讓代碼更加的清晰
{
printf("i is bigger than 0\n");
}
else
{
printf("i is not bigger than 0\n");
}
}
return 0;
}
while、for循環
#include<stdio.h>
//while循環,先循環在執行語句
int main()
{
int i = 1;
int sum = 0;//計算從1-100的和
while(i<=100)
{
sum += i; //或者sum = sum + i;
i++; //等價于i = i + 1 沒有這一步就會進入死循環了
}
printf("sum = %d\n", sum);
return 0;
}
#include<stdio.h>
//for循環
int main()
{
int i, sum;
//初始化
for(i = 1;i<=100;i++)//相比while循環for循環在一條語句內完成初始化 for循環的好處是不會讓編程者忘記i++這一步操作從而忘記表達式二i<=100進行假的操作
{
sum += i;//等價于sum = sum + i
}
printf("sum = %d\n", sum);
return 0;
}
//使用for循環還是使用while循環根據個人編程喜歡和解決問題的效率來選擇
#include<stdio.h>
//continue語句的作用:結束本次循環,即跳過循環體中下面尚未執行的語句,接著是否進行下一次循環的判斷
//求1-100的奇數和
int main()
{
int i, sum = 0;
for(i = 0;i<=100;i++)//在for后面加分號不會死循環,會結果不對
{
if(i%2==0)
{
continue;//continue下面的語句不會得到執行 直接跳出循環體 直接執行printf函數
}
sum = sum + i;
}
printf("sum=%d\n", sum);
return 0;
}
break語句
/*break語句的作用是結束整個循環過程,不在判斷執行循環的條件是否成立*/
#include<stdio.h>
int main()
{
int i, sum = 0;
for(i=1;i<=100;i++)
{
if(i>2000)
{
break;
}
sum += i;//sum = sum + i
}
return 0;
}
浙公網安備 33010602011771號