運算符:
表達式:由常量,變量,運算符組成,有確定的類型和數值.
1.2 是常量,也可以看做是常量表達式.
運算符
1:算術運算符: +, -, *, /, %
%:取餘或者叫模運算 13%5=3
2個操作數,雙目運算符
#include <stdio.h>
//int main(int argc, const char * argv[]) {
// int a = 10;
// int b = 20;
// int rst;
// rst = a+b;
// printf("%d + %d the answer is %d:\n",a,b,rst);
// rst = a-b;
// printf("%d - %d the answer is %d:\n",a,b,rst);
// rst = a*b;
// printf("%d * %d the answer is %d:\n",a,b,rst);
// rst = a/b;//2個int運算,結果還是int
// printf("%d / %d the answer is %d:\n",a,b,rst);
// rst = a%b;
// printf("%d %% %d the answer is %d:\n",a,b,rst);//%%可以格式化輸出%,
// printf("%d %c %d the answer is %d:\n",a,37,b,rst);//直接打印ASCII
// printf("%d %c %d the answer is %d:\n",a,'%',b,rst);//直接打印字符.
// return 0;
//}
//int main()
//{
// int a = 13,b = 29;
// int answer;
// answer = ((a+b)/(a-b))%(a*b);
// printf("the answer is :%d\n",answer);
//}
2:自增自減運算符: ++ , --
單目運算符
//int main()
//{
// int a = 10;
// int b;
// a++;//等價於a = a+1;
// printf("a=%d\n",a);//a=11
// b = a++;//等價於b=a;a=a+1;
// printf("b=%d\n",b);//b=11
// printf("a=%d\n",a);//a=12
// printf("a=%d\n",a++);//a=12 等價於定義一箇中間變量c=a++;打印的時候打印a的值,打印完成後a的值自加1然後賦值給c.
// printf("a=%d\n",a);//a=13
//
//}
//int main()
//{
// int a = 10;
// int b;
// ++a;
// printf("a=%d\n",a);//a=11
// b = ++a;
// printf("b=%d\n",b);//b=12等價於a=a+1;b=a;
// printf("a=%d\n",a);
// printf("a=%d\n",++a);
// printf("a=%d\n",a);
//
//}
3:關係運算符 > , < , =, >= , <= ,== ,!=
關係表達式成立的時候,表達式爲真,表達式的值爲1
關係表達式不成立的時候,表達式爲假,表達式的值爲0
表達式一般與if連用
if(表達式)
{
//語句;(表達式成立時運行此語句)
}
//練習:輸入兩個數字,輸出較大的值
//int main()
//{
// printf("%d\n",10>2);
// printf("%d\n",10==2);
//}
//int main()
//{
// int a,b;
// printf("請輸入兩個整數\n");
// scanf("%d%d",&a,&b);
// if (a>b) {
// printf("the max number is %d",a);
// }
// else
// {
// printf("the max number is %d",b);
// }
// return 0;
//}
4:邏輯運算符
&& 並且,就是兩個條件都成立,表達式纔是真.短路運算符
|| 或者,一個成立就成立,表達式就爲真.
! 不是,非真就是假,非假就是真.非零就是真,0是假
0~60 score>=0 && score<60
學生判分系統
0~59 不及格
60~79 及格
80~100優秀
//int main()
//{
// int score;
// printf("請輸入學生成績:\n");
// scanf("%d",&score);
// if ((score>=0) && (score<60)) {
// printf("成績爲不及格:%d\n",score);
// }
// else if((score>=60) && (score<80)){
// printf("成績爲及格:%d\n",score);
// }
// else if ((score>=80) && (score<=100)){
// printf("成績爲優秀:%d\n",score);
// }
// else {
// printf("輸入的學生成績不合法,請重新輸入.\n");
// }
// return 0;
//}
5: 賦值運算符
= ,+= ,*=, /=
//int main()
//{
// int a = 10;
// int b = 3;
//// a += b;//等價於a=a+b;
//// a -= b;//等價於a=a-b;
//// a *= b;//等價於a=a*b;
// a /= b;//等價於a=a/b;
// printf("a=%d\n",a);
//}
//
//int main()
//{
// int a,b;//一次性定義同類型的兩個變量
// a = b = 5;//b=5是個賦值表達式,值和類型與b保持一致.
// printf("a=%d,b=%d\n",a,b);
//}
6: 逗號運算符,優先級特別低
表達式1,表達式2,表達式3,.....表達式n
整個表達式的值=表達式n 前面表達式都會運算.
//int main()
//{
// int a = 5;
// int b = 10;
// printf("%d\n",(a++,b++));//結果爲10
// printf("a=%d,b=%d\n",a,b);//結果爲a=6,b=11
//// printf("%d",1,2,3,4);//結果爲1
//// printf("%d",(1,2,3,4));//結果爲4 後面(1,2,3,4)變成一個逗號表達式
// return 0;
//}
7: 條件運算符
(表達式1)?表達式2:表達式3;
先運行表達式1,如果表達式1成立運行表達式2,並且返回表達式2的值;如果表達式1不成立運行表達式3,返回表達式3的值.
//int main()
//{
// int a = 10;
// int b = 12;
// int c = 32;
// int max = (((a>b)?a:b)>c)?((a>b)?a:b):c;//求三個數的較大者.
// int min = (a<b)?a:b;
// printf("max = %d\n",max);
// printf("min = %d\n",min);
//}
8: sizeof(類型或者表達式)
sizeof表達式是unsigned long
//int main()
//{
// int a = 10;
// printf("sizeof(int)=%lu\n",sizeof(int));
// printf("sizeof(a)=%lu\n",sizeof(a));
// printf("sizeof(a/2)=%lu\n",sizeof(a/2));
// printf("sizeof(a/2.0)=%lu\n",sizeof(a/2.0));
// return 0;
//}
9:位操作 bit
>> 右移 相當於/2^n
<< 左移 相當於*2^n
& 位與 兩個位同時爲1的時候才取1
| 位或 只要有一個位爲1就取1
~按位取反
//int main()
//{
// char ch = 0x33;//0011,0011
// printf("before ch=%d\n",ch);
// ch = ch>>1;
// printf("ch=%d,0x%x\n",ch,ch);//0001,1001 --> ch=25,0x19
// ch = 0x33;
// ch = ch<<1;
// printf("ch=%d,0x%x\n",ch,ch);//0110,0110 --> ch=102,0x66
// ch = 0x33;
// ch = ch&0xf0;
// /*
// 0x33:0011,0011
// & oxf0:1111,0000 //可以取出ch的高四位
// ---------------
// :0011,0000 --> 0x30
// */
// printf("ch=%d,0x%x\n",ch,ch);//0011,0000 --> ch=48,0x30
//
// ch = 0x33;
// ch = ch|0xf0;
// /*
// 0x33:0011,0011
// | oxf0:1111,0000 //把ch的高四位設置成1
// ---------------
// :1111,0011
// */
// printf("ch=%d,0x%x\n",ch,ch);//0011,0000 --> ch=-13,0xf3
//
// ch = 0x33;
// ch = ~ch;
// /*
// ch 0x33:0011,0011
// ~ch :1100,1100
// -------------------
// :cc
// */
// printf("ch=%d,0x%x\n",ch,ch);//1100,1100 --> ch=-52,0xcc
//}
10:關係運算符
括號>單目>算術>關係>邏輯>賦值>逗號
//int main()
//{
// int a;
// printf("%d\n",1+2>1);//結果爲1,說明算術運算符優先級高於關係運算符 算術>關係
// printf("%d\n",0>2||1);//結果爲1,說名關係運算符優先級高於邏輯運算符關係>邏輯
// printf("%d\n",a=0||1);//結果爲1,說明邏輯運算符優先級高於賦值運算符邏輯>賦值
// printf("%d\n",a);//j結果爲1
// a=100,300;
// printf("%d\n",a);//結果爲100,說明賦值運算符優先級高於逗號運算符 賦值>逗號
//
//}
//int main()
//{
// int a =5;
// int b;
// b = 1 || a++;//邏輯運算的短路特性,在 || 邏輯表達式中,1 || 表達式1 表達式1不會運算
// printf("b=%d,a=%d\n",b,a);//b=1,a=5
// b = 0 && a++;//邏輯運算的短路特性,在 && 邏輯表達式中,0 && 表達式1 表達式1不會運算
// printf("b=%d,a=%d\n",b,a);
//}
//int main()
//{
// char ch;
// ch = 20;//int 賦值給 char --> 隱式的類型轉化
// printf("ch = %d\n",ch);
// ch = 564;
// printf("ch = %d\n",ch);
// printf("564 = 0x%x,ch = 0x%x\n",564,ch);//564 = 0x234,ch = 0x34 如果超過char的範圍,那麼截斷保留低八位
//
// int a = 3.14;//double轉換成 int
// printf("a=%d\n",a);//結果爲3
// //高精度給低精度類型的數據賦值,可能會損失精度
//
// ch = 25;
// a = ch;
// printf("a=%d\n",a);//低精度給高精度賦值,不會損失精度
//
// ch = -1;
// a = ch;
// printf("a=%d\n",a);//爲了保持數據不變,進行位擴展,在前面填充的位數據全部填充爲1 因爲char爲1個字節,8bit 而int爲4個字節,32bit 因爲char爲負數,最高位爲1所以在數據填充的時候前面所有數據全部填充爲1
//}
注意: 1, 整型運算,如果有long,都轉成long運算.
2, 如果有double,轉成double運算.
3, 強制類型轉換 ,(類型)表達式;
4, char和short運算時轉換成int運算(可以保證精度)
//int main()
//{
// int a = 23;
// int b = 10;
// long l = 30;
// printf("sizeof(a+l)=%lu\n",sizeof(a+l));//sizeof(a+l)=8
// printf("sizeof(a/2.0)=%lu\n",sizeof(a/2.0));//sizeof(a/2.0)=8
// printf("%f\n",(float)a/b);//2.300000 只對a作用強轉,把a轉換成float,然後float與int運算,都轉成float
// printf("%f\n",(float)(a/b));//2.000000 錯誤的,a/b是int,結果爲2,然後整體轉換成float型---->2.000000
//}
//int main()
//{
// char ch = 34;
// short s = 25;
// printf("sizeof(ch+s)=%lu\n",sizeof(ch+s));//sizeof(ch+s)=4
// printf("sizeof(~ch)=%lu\n",sizeof(~ch));//sizeof(~ch)=4
// int i;
// i = ch + s ;//通過賦值,隱式的轉成左邊的類型,保證左邊的類型能接收就可以.
//}
基本數據類型
1:字符輸入輸出
getchar()
putchar(ch)
#include <stdio.h>
//int main(int argc, const char * argv[]) {
// char ch = 'a';
// char c = 's';
// putchar(ch);
// putchar('\n');
// putchar('s');
// putchar('\n');
// putchar('f');
// putchar('\n');
// putchar(c);
// return 0;
//}
//int main()
//{
// char ch;
// ch = getchar();//去輸入緩衝區獲取一個字符,賦值給ch.等待用戶輸入,輸入回車鍵的時候才把用戶輸入的字符送入輸入緩衝區
// printf("獲取到的字符是%c,該字符的ASCII是%d\n",ch,ch);
// ch = getchar();//如果第一次輸入的是a \n那麼此次獲取的是\n字符.
// printf("獲取到的字符是%c,該字符的ASCII是%d\n",ch,ch);
// return 0;
//}
printf("格式化字符串",參數列表);
scanf("格式化字符串",參數的地址列表);
2:printf 格式控制
%3d : 打印右對齊,前面不足用空格補齊.如果說本來位寬就已經 >=設定的3 就不起作用.
%03d: 打印右對齊,前面加0補足.
%.2f: 小數點後保留兩位小數
%5.2f: 一共打印五位寬,右對齊,不足位加空格補齊.包含小數點.
%1.2f: 打印右對齊,位寬大於設置位寬,不做處理
//int main()
//{
// int score1 = 100;
// int score2 = 5;
// int score3 = 12;
// float pi = 3.14;
// printf("小明分數 : %3d\n",score1);//小明分數 : 100
// printf("小宏分數 : %3d\n",score2);//小宏分數 : 5
// printf("小量分數 : %03d\n",score3);//小量分數 : 012
// printf("pi = %f\n",pi);//pi = 3.140000默認6位小數
// printf("pi = %.2f\n",pi);//pi = 3.14 保留兩位小數
// printf("pi = %5.2f\n",pi);//pi = 3.14右對齊
// printf("pi = %1.2f\n",pi);//pi = 3.14 不做任何處理
// printf("hello ,%d年",2015);
//}
//int main()
//{
// int i;
// char ch ;
// short s;
// printf("請輸入一個int\n");
// scanf("%d",&i );
// printf("i = %d\n",i);
//
// getchar();//取出上次殘留的'\n'字符
// printf("請輸入一個char\n");
// scanf("%c",&ch);
// printf("ch = %c,ASCII=%d\n",ch,ch);
//
// printf("請輸入一個short\n");
// scanf("%hd",&s);//取字符的時候纔會把'\n'取出.但是取整數是沒有問題的,因爲'\n'不是有效的整數scanf會自動忽略,它只是一個有效的字符.
// printf("s = %hd\n",s);
//}
//int main()
//{
// char str[100];
// printf("請輸入一個字符串\n");
// scanf("%s",str);//str是字符數組的名字,裏面存儲的是數組的首地址. 不能接收空格, scanf遇到空格會分割字符串
// printf("%s\n",str);
// return 0;
//}
3:scanf("格式化字符串",參數化列表);
注意點:
1:不能顯示非格式字符,格式化字符串不能寫提示字符,包括轉義字符'\n'等.
2:scanf根據空格 ,回車,Tab鍵分個字符.
3:如果格式化字符串中有非格式化字符,那麼在輸入的時候也要輸入該非格式化字符
//int main()
//{
// int a;
// int b;
// printf("請輸入2個整數:\n");
// scanf("%d",&a);
// scanf("%d",&b);
// scanf("%d%d",&a,&b);//合理的輸入空格,回車,Tab都行
// scanf("a=%d,b=%d",&a,&b);//合理的輸入是a=1,b=4
// printf("a=%d,b=%d",a,b);
// return 0;
//}
//int main()
//{
// char ch1;
// char ch2;
// printf("請輸入兩個字符\n");
// scanf("%c%c",&ch1,&ch2);//正確是輸入是兩個字符連續輸入 例如ab 加入任何其他符號都會被認爲是有效的字符.
// scanf("ch1=%c,ch2=%c",&ch1,&ch2);//正確的輸入ch1=e,ch3
// printf("ch1 = %c.ASCII = %d\n",ch1,ch1);
// printf("ch2 = %c.ASCII = %d\n",ch2,ch2);
//}
//int main()
//{
// int a;
// printf("請輸入一個整數\n");
// scanf("%3d",&a);//輸入123456,結果只取前三位123..但是不能用%.2f這類.因爲不能確定一個數字是多長,有可能是溢出數據
// printf("a=%d\n",a);
//}
/*
4:字符串的接收,字符集的接收
[a-z] 表示合法的字符集,只能接收小寫字母a-z,遇到其他非法的字母就停止接收.
[^\n] 表示補集,只有'\n'是唯一的非法字符,遇到'\n'就停止接收
int main()
{
char str[100];
printf("請輸入一個字符串\n");
// scanf("%s",str);//輸入hello world ,接收hello
scanf("%[^\n]",str);//遇到'\n'停止接收,可以接收空格.
// scanf("%[a-z]",str);//只能接收a-z之間的數字.
printf("str = %s\n",str);
return 0;
}