首页
/
每日頭條
/
生活
/
c語言之變量總結
c語言之變量總結
更新时间:2024-10-13 02:20:00
操作符算數操作符

% 取模操作符,左右操作數都必須為整數/ 除号等, - * 的左右操作數可以為浮點數或整數

移位操作符

右移操作符:1.算術右移右邊丢棄,左邊補原符号位

int main()//算術右移,右邊丢棄,左邊補原符号位 { int a = -1;//負數按照補碼的方式存儲,正數存儲的也是補碼(正數的補碼和原碼相同) //1000000000000001-原碼 //1111111111111110-補碼 //1111111111111111-補碼 int b = a >> 1;//移位移的是内存中的二進制 printf("%d\n", b); return 0;//結果為-1,證明負數右移之後還是負數 }

c語言之變量總結(我的C語言日記09-操作符)1

​2.邏輯右移右邊丢棄,左邊補0

右移一位有除二的效果

int main() { int a = 16; int b = a >> 1; int c = a >> 2; printf("%d %d\n", b,c);//結果分别為8 4 return 0; }

c語言之變量總結(我的C語言日記09-操作符)2

​左移操作符:左邊丢棄,右邊補0有乘二的效果

int main() { int a = 5; int b = a << 1; printf("%d\n", b); return 0;//10 }

負數左移還是負數

​​

int main() { int a = -5; int b = a << 1; printf("%d\n", b); return 0;//-10 }

c語言之變量總結(我的C語言日記09-操作符)3

​警告⚠

1.不要移動負數位,是未定義的行為

int num = 10; num >> -1;///錯誤

2.隻能作用于整數

&、|、^&按位與​

int main() { //&按2進制位與 int a = 3; int b = 5; int c = a&b; //011 //101 //001 printf("%d\n", c); return 0; }

|按位或​

int main() { //|按2進制位或 int a = 3; int b = 5; int c = a | b; //011 //101 //111 printf("%d\n", c);//7 return 0; }

^按位異或​

int main() { //^按2進制位異或 相同為0,相異為1 int a = 3; int b = 5; int c = a^b; //011 //101 //110 printf("%d\n", c); return 0; }

​練習:編輯代碼實現求一個整數存儲在内存中的二進制中的1的個數

int main() { int num = 0; int count = 0; scanf("%d", &num); //統計num的補碼中有幾個1 while (num) { if (num % 2 == 1)//判斷末位是否為1 count ; num = num / 2;//去掉判斷過的末位 } printf("%d\n", count); return 0;//但負數會出現問題 }

​但負數會出現問題

int main() { int num = 0; int count = 0; scanf("%d", &num);//當num&1,比如num=3即0011,num&1即為0011&0001,末位為1時&1必定為1,末位是0&1必定是0 int i = 0; for (i = 0; i < 32; i ) { if (1 == ((num >> i) & 1)) count ; } printf("%d\n", count); return 0; }

邏輯操作符

&&邏輯與 ||邏輯或邏輯與或和按位與或是有區别的,按位與或:二進制對應位進行與或邏輯與或:判斷數字本身的真假​

int main() { int i = 0, a = 0, b = 2, c = 3, d = 4; i = a && b && d ;//a=0&&後面都為假,不運行//用後自加一 printf("a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d); return 0;//1 2 3 4 }

&&

左邊為假&&後面不計算​

int main() { int i = 0, a = 0, b = 2, c = 3, d = 4; i = a && b && d ;//a=0為假&&後面不計算,不運行//用後自加一 printf("a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d); return 0;//1 2 3 4 }

左邊為真時&&後計算​

int main() { int i = 0, a = 1, b = 2, c = 3, d = 4; i = a && b && d ; printf("a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d); return 0;//2 3 3 5 }

​||

左邊為真時||後不計算

int main() { int i = 0, a = 1, b = 2, c = 3, d = 4; i = a || b || d ;//a=1為真||後面的不計算,然後自加一 printf("a=%d\n b=%d\n c=%d\n d=%d\n", a, b, c, d); return 0;//2 2 3 4 }

條件操作符

格式為:表達式1?表達式2:表達式3;表達式1為真時結果為表達式2,表達式為假時結果為表達式3​

int main() { int a = 0; int b = 0; if (a > 5) b = 3; else b = -3; //用條件操作符來表示 b = (a > 5 ? 3 : -3); return 0; }

逗号表達式

從左向右依次執行,整個表達式的結果是最後一個表達式的結果​

int a=1;int b=2;int c=(a>b,a=b 10,a,b=a 1);c的值為13

還可以簡化表達式

a = get_val();count_val(a);while (a > 0){//業務處理a = get_val();count_val(a);}//----逗号表達式優化---while (a = get_val(), count_val(a), a > 0){//業務處理}

下标引用、函數調用和結構成員[]下标引用操作符

操作數:一個數組名 一個索引值

int arr[10];//創建數組arr[9] = 10;//實用下标引用操作符[]的兩個操作符是arr和9

函數調用操作符

調用函數的時候的()就是函數調用操作符,定義函數的()不是()的操作數有:函數名,參數

結構成員

struct Stu { char name[20];//成員變量 int age; char id[20]; }; int main() { int a = 10; //使用struct Stu這個類型創建了一個學生對象s1,并初始化 struct Stu s1 = {"張三",20,"2019010305"}; printf("%d\n", s1.age); //結構體變量.成員名//.操作符可以訪問成員 printf("%s\n", s1.id); struct Stu* ps = &s1; printf("%d\n", (*ps).age); printf("%d\n", ps->age);//結構體指針->成員名 return 0; }

​struct Stu{}相當于圖紙,根據圖紙建造出來名為s1的房子,所以struct Stu s1占用内存空間,可以存放各種參數

表達式求值隐式類型轉換

c的整型算數運算總是至少以缺省整型類型的精度來進行的為了獲得這個精度,表達式中的字符和短整型操作數在使用之前被轉換為普通整型,這種轉換稱為整型提升

整型提升是按照變量的數據類型的符号位來提升的(高位補符号位)​

int main() { char a = 3; //00000000000000000000000000000011 正常一個整數所占32位 //00000011這就是char a //但char隻能存放一個字節,要發生截斷,取低位一個字節 char b = 127; //00000000000000000000000001111111 同理 //01111111這就是char b char c = a b;//計算時進行整型提升 //00000000000000000000000000000011 //整型提升:高位補符号位 //00000000000000000000000001111111 //整型提升:高位補符号位 //00000000000000000000000010000010 a b得到c,因為c是char類型要截斷 //10000010就是char c printf("%d\n", c);//要打印整型//整型提升:高位補符号位 //11111111111111111111111110000010 - 補碼//因為是負數,所以要求原碼 //11111111111111111111111110000001 - 反碼 //10000000000000000000000001111110 - 原碼//-126 return 0; }

算術轉換

類型不同的操作數進行運算,低精度的類型轉換為高精度的類型,類型一緻再進行運算

自加和自減詳解

總結:自增減( /--)前置:在運算之改變變量自增減( /--)後置:在運算之改變變量

1.​

int main() { int i = 0; int j = i i;// i優先級高于i ,所以相當于int j= i i ; //此時i=0,1(此時i=1) 1(此時i=2)=2 int k = --i i--;//此時i=2,(此時i=1)1 1(此時i=0)=2 printf("%d %d %d\n", i, j, k); return 0; }

​當運行int j = i i;分析優先級:自加高于 ,兩個自加同級從左向右計算;其中 i的優先級比i 高,即變為int j= i i 運算之前:因為 i,在運算之前使得變量i加一(0 1=1);此時i=1運算之中:加上i ,因為是後置 ,所以此時i仍然是1,所以為1 1=2賦值給j運算之後:因為i ,在運算之後使得變量i加一(1 1=2);此時i=2當運行int k = --i i--;運算之前:因為--i,在運算之前使得變量i減一(2-1=1);此時i=1運算之中:加上i--,因為是後置--,所以此時i仍然是1,所以為1 1=2賦值給j運算之後:因為i--,在運算之後使得變量i減一(1-1=0);此時i=0

2.

int main() { int i = 0; int j = i i ;//0 0(i=1)=0 printf("%d %d\n", i, j); return 0; }

運行int j = i i ;運算之前:無運算之中:加上i ,因為是後置 ,所以此時i仍然是0,所以為0 0=0賦值給j運算之後:因為i ,在運算之後使得變量i加一(0 1=1);此時i=1

3.​

int main() { int i = 0; int j = i i;//1 1=2 printf("%d %d\n", i, j); return 0; }

​運行 int j = i i;分析優先級:自加高于 ,即變為int j= i i;運算之前:因為 i,在運算之前使得變量i加一(0 1=1);此時i=1運算之中:加上i,此時i仍然是1,所以為1 1=2賦值給j運算之後:無

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
客廳地磚松動最佳處理方法
客廳地磚松動最佳處理方法
首先将松動的地磚從中心往四周用撬杠撬動,從翹起的那一端将地磚取出來,地磚取後,清理地磚反面及地面下層的灰塵、雜質。接着将108膠水與水泥砂漿混合,再将混合液體倒入縫隙和瓷磚底部,然後給地磚反面均勻的塗...
2024-10-13
地下室堵漏注漿施工方法
地下室堵漏注漿施工方法
地下室堵漏注漿的施工方法主要包括标記、打孔、布嘴、封閉、壓水實驗、注漿、封孔。1、首先需要将它的基層清理幹淨,在有滲漏的地方做上标記。2、在滲漏的地方用風鑽打孔,打孔的直徑要以注漿管的外徑作為标準。3...
2024-10-13
仙客來冬季怎麼養
仙客來冬季怎麼養
1、溫度要求。仙客來對于溫度的要求較高,尤其是冬末時正值它的開花時期,一般12月就會長出花蕾,所以這時就要注意溫度不宜過低,以免影響到它的正常開花。需要保持溫度在15-18度之間,一旦低于5度,就會導緻其生長緩慢,開花少或者根本不可能開花。尤其是在北方地區養殖的朋友,冬季氣溫較低,需要做好保暖工作,...
2024-10-13
樓梯間的窗戶尺寸一般為多少
樓梯間的窗戶尺寸一般為多少
樓梯間窗戶的尺寸一般高1.5米。樓梯間窗戶的窗頂需要距離樓面的高度大約為2.4米,窗台的高度大約為0.9米,當窗台的高度低于0.8米時需要采取一定的防護措施。窗戶的尺寸還要根據樓梯間具體牆面的大小來進...
2024-10-13
海砂能不能用于建築
海砂能不能用于建築
海沙不能用于建築。因為海沙中的氯離子非常高,氯離子過量會使混凝土發生反應,造成鋼筋出現被鏽蝕的現象,同時,氯離子還會使鋼筋産生膨脹,從而使混凝土出現開裂的現象。另外,氯離子還會使牆壁産生污漬,所以一般...
2024-10-13
Copyright 2023-2024 - www.tftnews.com All Rights Reserved