% 取模操作符,左右操作數都必須為整數/ 除号等, - * 的左右操作數可以為浮點數或整數
移位操作符右移操作符:1.算術右移右邊丢棄,左邊補原符号位
int main()//算術右移,右邊丢棄,左邊補原符号位
{
int a = -1;//負數按照補碼的方式存儲,正數存儲的也是補碼(正數的補碼和原碼相同)
//1000000000000001-原碼
//1111111111111110-補碼
//1111111111111111-補碼
int b = a >> 1;//移位移的是内存中的二進制
printf("%d\n", b);
return 0;//結果為-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;
}
左移操作符:左邊丢棄,右邊補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
}
警告⚠
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運算之後:無
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!