計算機內存中的數據能夠經過變量,常量來表示和存儲,那麼這些數據如何運算?
C語言中提供了大量(34種)的運算符能夠用來完成數據的算術,賦值,邏輯,關係,條件判斷以及自增自減運算和基於二進制的位運算,同時提供了跨平臺的用於數據格式化輸入輸出的函數printf()和scanf(),而實際上計算機須要去完成的任務正是讀取輸入的數據,根據業務邏輯進行計算以後將結果輸出。數組
在學習爲了完成數據的複雜計算而生的那些運算符以前,須要先明白幾個概念:微信
操做數:參與計算的數據,能夠是以前學過的整數,浮點數和字符以及之後學的。
運算符:也就是執行某項計算的符號,例如+ - * / % >等等
表達式:操做數和運算符的組合,例如 x+y;異步
而運算符一般是有優先級和結合性的特性:
優先級:以算術運算符爲例子,一般是先乘除後加減,可使用()提升優先級
結合性:繼續以算術運算符爲例子,當優先級相同時(表達式中只有同級別的運算符),一般是從左到右開始執行的。函數
可是實際生產和生活中一般都是各類運算和後面學習的流程控制語句聯合嵌套使用的,是現實生活中的業務複雜度決定的。學習
算術運算符主要是用來完成數學運算的,C語言支持數學上的加減乘除四則混合運算,同時還有取模運算(%),也就是求被除數/除數=商數…餘數,須要指出的是隻有整數才能求模。ui
下面程序案例演示了算術運算符使用過程當中須要注意的事項:
1 整數和整數運算,結果是整數,尤爲是在使用除法時須要注意會捨去小數部分
2 當有多種數據類型(int double char)參與運算時,運算結果的數據類型是參與運算的最大的數據類型,這樣保持數據運算的準確性。spa
#include <stdio.h> /* 算術運算符 + - * - @author Tony 18601767221@163.com @since 20160526 10:13 */ void alg_operator() { printf("%d\n", 1 + 3); printf("%d\n", -3); //加減運算符有時候會被當作正負數 printf("%d\n", 5 / 2.0);//運算的結果是2.5 可是printf在打印輸出時不會作強制類型轉換,所以這裏解析錯誤,結果爲0 printf("%d\n", (int)(3.5 * 2));// 當參與運算的類型不一致時,若是想要指定類型的結果,能夠經過強制類型轉換來實現 printf("3/2=%d", 3 / 2); //兩個整數相除 小數部分被捨去 }
求模運算的結果與被除數相同,若是被除數是正數,那麼取餘的結果也是正數,反之也成立。命令行
/* 算術運算符 求模的結果和被除數相關 @author Tony 18601767221@163.com @since 20160526 10:13 */ void modulo_operator() { //整數能作求模運算,浮點數不能 //int result = 5.0 % 3; 編譯錯誤 //求模運算的結果與被除數相同 int result = 5 % 3; //1...2 結果就是2 printf("5模3=%d\n", result); result = -5 % 3;// -1...-2 結果就是-2 printf("-5模3=%d\n", result); result = 5 % -3;// -1...2 結果就是2 printf("5模-3=%d\n", result); result = -5 % -3;// 1...-2 結果就是-2 printf("-5 模-3=%d\n", result); }
取模運算符可使用乘除法實現:code
/*
使用乘除法實現取模運算
@author Tony 18601767221@163.com @since 20160528 20:28 */ void delivery() { int result = 5 % 3; printf("取模運算結果>>>result=%d\n",result); result = 5 - (5 / 3) * 3; //先取整相乘再相減 printf("乘除法運算結果>>>result=%d\n", result); }
取模運算符的使用場景:整數反轉,例如12345反轉成54321regexp
/*
使用求模運算符實現整數反轉
@author Tony 18601767221@163.com @since 20160526 10:36 */ void modulo_reversal_sample() { int num = 0; printf("請輸入一個反轉的五位整數\n"); scanf("%d", &num); //讀取鍵盤上輸入的整數 int unit = num % 10; int decade = num / 10 % 10; int hundred = num / 100 % 100 % 10; int thousand = num / 1000 % 10; int tenThousand = num / 10000; int reseveal = tenThousand + thousand * 10 + hundred * 100 + decade * 1000 + unit * 10000; printf("反轉以前的數字%d\n反轉以後的數字%d\n", num, reseveal); }
在學習變量時屢次使用到賦值運算符」=」,須要區別的是C語言中的相等性判斷是使用」==」兩個等號來實現的。
賦值運算符的做用就是將右邊的表達式或者常量值賦值給左邊的變量,賦值以前會進行類型轉換(將右邊的值轉換成左邊的變量類型)。
/* 賦值運算符 @author Tony 18601767221@163.com @since 20160526 10:36 */ void assignment_operator() { // C語言中的=表示賦值運算符 int value = 12; //將12賦值給變量value printf("value=%d\n", value); //賦值運算符會自動將右邊的表達式計算的結果或者是常量自動轉換成左邊的變量類型 double db = 12 + 12; printf("db=%.2f\n", db); int one, two, three; one = two = three = value; //當同時有多個賦值運算時,從右往左執行賦值運算 //算數運算符優先級高於賦值運算符優先級 //複雜賦值運算符 int num = 10; num +=-2; num -= 4; num *= 6; num /= 8; num %= 10; // //賦值運算符是從右向左開始執行 int result = 5; result += result -= result *= result /= result; // result+=result-=result*=result=result/result printf("result=%d\n",result); }
複雜運算符的使用場景:1-100之間的整數累加求和
/* //複雜賦值運算符的應用場景, 1-100之間的整數累加求和 @author Tony 18601767221@163.com @since 20160518 09:34 */ void assignement_sample() { int i = 1; int sum = 0; while (i <=100) { sum += i;//做用等同於sum =sum +i; i += 1; } printf("1到100之間的整數和爲%d\n", sum); }
複雜賦值運算符的使用場景:計算1-100之間的偶數和
/* 偶數求和 @author Tony 18601767221@163.com @since 20160518 09:36 */ void even_sum() { int i = 0; int sum = 0; while (i<=100) { sum += i; i += 2; } printf("1到100之間的偶數和爲%d\n", sum); }
自增自減運算符主要的用途是讓變量自增1或者自減1,不能做用於常量或者表達式。自增(++)能夠前置或者後置,前置變量表示先自增1,再引用,然後置1表示先引用,後自增1。
當自增自減運算符和算術運算符執行混合運算時,自增自減運算符高於算術運算的優先級。
#include <stdio.h> /* 自增自減運算符 @author Tony 18601767221@163.com @since 20160526 11:24 */ void auto_increment() { //只有變量可以自增,常量與表達式不能夠自增!!! int num = 10; num++; //讓num自增1 自增運算符++能夠放到整數變量num前面或者後面,若是是單獨一行語句,效果是同樣的 printf("num=%d\n", num); printf("前置++和後置++運算的區別\n"); printf("後置++運算\n"); int age = 28; printf("age=%d\n", age++);//先引用打印 printf("age=%d\n", age);//再自增 printf("前置++運算\n"); int year = 2016; printf("age=%d\n", ++year);//先自增 printf("age=%d\n", year);//再引用打印 //自增運算符優先級高於算數運算符優先級 int val = 10; printf("val=%d\n", ++val + 3);//val先自增1 再加3 val = 3; printf("val=%d\n", -val++);//val先自增長1再變成負3 int number = 10; int data = 5; printf("%d", ++number*data);// 55 int one = 5; int two = 10; int sum = one++ + two; printf("sum =%d\n",sum); sum = ++one + two; printf("sum =%d\n", sum); }
自增運算符經常使用在循環中改變循環變量的值
#include <stdlib.h> /* 自增自減的典型使用場景 @author Tony 18601767221@163.com @since 20160528 08:59 */ void auto_increment_sample() { // int count = 0; while (count++<5) { system("start notepad"); //異步調用記事本 } while (count-->0) { system("calc"); } }
使用自增運算符實現基於命令行的變色龍
#include <Windows.h> #include <stdlib.h> #include <stdio.h> /* 實現命令行窗口的變色龍 @author Tony 18601767221@163.com @since 20160528 09:00 */ void changeColor() { char command[32]; //聲明字符數組保存輸入的命令 int i = 0; while (i<0xf) { sprintf(command, "color %x%x", i, 15 - i);// 使用sprintf函數實現給字符串賦值 system(command); Sleep(1000); //1秒鐘改變一次窗口的顏色 i++; } }
使用自減運算符實現基於命令行的標題時間變動 倒計時的秒錶
#include <stdio.h> #include <stdlib.h> #include <Windows.h> /* 使用自增自減實現秒錶的倒計時 @author Tony 18601767221@163.com @since 20160528 09:16 */ void timer() { int second = 0; printf("請輸入你要開始倒計時的秒鐘數字\n"); scanf("%d",&second); char command[32]; //聲明一個字符數組保存執行的倒計時(以命令行窗口的標題時間變化) while (second-->0) { sprintf(command,"title %d",second); system(command); Sleep(1000); //利用Windows的Sleep函數實現暫停1秒鐘 } }
邏輯運算符用於計算常量,變量或者表達式的邏輯值,作多個條件判斷。主要有三個邏輯運算符:
邏輯與(&&):當多個表達式計算結果爲非0時,邏輯與的計算結果爲1,不然若是有一個表達式結果爲0(邏輯與的計算結果爲0),那麼邏輯與將不會再執行剩餘的表達式,此時短路發生!(邏輯與能夠形象的理解成白富美找男友,要又高又富又帥,多個條件都要知足)
邏輯或(||):當多個表達式計算結果中有1個爲非0時,邏輯或的計算結果爲1,此時邏輯或將再也不執行剩餘的表達式,短路發生,不然若是全部表達式結果都爲0,結果爲0。(邏輯或能夠形象的理解爲IT男找女友,只要窈窕淑女一個條件便可)
邏輯非(!):對錶達式運算的結果取反,即若是表達式運算結果爲0,邏輯非就是非0,反之也成立。
使用關係和邏輯運算符實現大小寫字母的相互轉換
/* 使用關係運算符結合邏輯運算符實現大小寫字母轉換 @author Tony 18601767221@163.com @since 20160530 20:59 */ void releation_sample() { printf("請輸入一個字母\n"); char input = getchar(); //獲取輸入的字母 input >= 'a'&&input <= 'z' ? putchar(input -= 0x20) : input >= 'A'&&input <= 'Z' ? putchar(input += 0x20) : putchar(input); printf("\n"); }
C語言的關係運算符和數學上的大於(>),小於(<),大於等於(>=),小於等於(<=)以及不等於(!=)相對應,只是用在C語言的表達式中產生的結果是0(假)或者1(真)。
/*
關係運算符的運算結果
@author Tony 18601767221@163.com @since 20160529 08:40 */ void releation_operator() { int x = 10; int y = 20; printf("%d\n",x>y); //表達式不成立 結果爲0 printf("%d\n",x<y);//表達式成立結果爲1 }
邏輯運算符使用的那些坑…
/* 邏輯運算 @author Tony 18601767221@163.com @since 20160528 12:56 */ void logic_operator() { //&& 多個表達式運算結果爲非0 邏輯與爲1,不然爲0 int age = 28; printf("邏輯與短路特性:%d\n",3>5&&++age); //當明確計算結果時(邏輯與有一個計算結果爲0)再也不執行剩餘的表達式(這裏的++age不會再執行) printf("age=%d\n",age);//所以age變量的值和聲明初始化的結果同樣 //|| 多個表達式運算結果中有一個爲非0 邏輯或爲1,不然(都是0的結果)爲0 printf("邏輯或短路特性:%d\n",3<5||++age);//這裏也不會執行++age,這個就是邏輯或的短路特性 printf("age=%d\n", age);//所以age變量的值和聲明初始化的結果同樣 //! 對錶達式運算的結果取反,1變爲0 0變爲1 printf("3<5取反的運算結果爲:%d\n",!3<5); //對結果取反 }
使用關係和邏輯運算符實現商場的購物打折程序
/* 商品打折系統 @author Tony 18601767221@163.com @since 20160530 21:11 */ void discount() { double unitPrice = 128.8;//商品單價 int number = 10;//購買數量 double totalPrice = unitPrice*number; //計算總價 double nineDiscountPrice = totalPrice*0.9; //九折 double eightDiscountPrice = totalPrice*0.8;//八折 //不一樣的商品價格實現不一樣的折扣 totalPrice >= 1000 ? totalPrice=nineDiscountPrice: totalPrice >= 1500 ? totalPrice=eightDiscountPrice : nineDiscountPrice; printf("最終商品的交易價格爲%.2f\n",totalPrice); }
三元運算符的通常形式是表達式1?表達式2:表達式3,當表達式1的結果爲非0時,執行表達式2,不然就執行表達式3。三目運算符能夠實現if/else語句的功能。
#include <stdio.h> #include <stdlib.h> /* 三目運算符使用案例 @author Tony 18601767221@163.com @since 20160526 13:24 */ void ternary_operator() { 0 ? system("calc") : system("tasklist"),system("explorer"); //這裏會執行調用notepad -1 ? system("system tasklist"),system("ipconfig"):system("calc");//執行tasklist和calc int num = rand(); //獲取一個隨機值 printf("產生的隨機值爲%d\n",num); num > 80 ? printf("你贏了") : printf("你輸了"); int one = 100; int two = 200; int max = one > two ? one : two; printf("兩個整數中的最大值爲%d\n", max); }
結合關係運算符和以時間爲隨機數的種子數實現賭博機
#include <stdio.h> #include <stdlib.h> #include <time.h> //引入時間頭文件 #include <Windows.h> /* 賭博機的原理 @author Tony 18601767221@163.com @since 20160529 08:15 */ void winning_rate(){ time_t ts; //聲明一個時間類型的變量 int num=0; srand((unsigned int)(time)(&ts)); //定義隨機數種子,每次產生的隨機數都不同 num = rand() % 100;//產生0-100之間的整數 num > 80 ? printf("你贏了"),system("echo 得到80W元大獎") : printf("你輸了"),system("echo 沒有中獎"); }
使用三目運算符實現求四個整數中的最大值
#include <stdio.h> /* 獲取最大值 @author Tony 18601767221@163.com @since 20160529 08:20 */ void get_max_value(){ int max =0; int one = 66; int two = 77; int three = 88; int four = 99; max = one > two ? one : two; max = max > three ? max : three; max = max > four ? max : four; printf("四個整數中最大的值爲%d\n", max); }
歡迎掃描下方的二維碼,關注微信公衆服務號-藝無止境,分享IT技術乾貨。