天天看點

c語言—操作符篇—筆記

這章有很多要記得東西,比如操作符屬性表(未附),真的需要記憶。

操作符

1.分類

算術操作符

移位操作符

位操作符

指派操作符

單目操作符

關系操作符

邏輯操作符

條件操作符

逗号表達式

2.算術操作符

+ - * / %      

3.移位操作符

<< 左移操作符
(左邊抛棄、右邊補0)

>> 右移操作符
1. 邏輯移位
左邊用0填充,右邊丢棄
2. 算術移位
左邊用原該值的符号位填充,右邊丢棄      
int num = 10;
num>>-1;//error      

4.位操作符

& //按位與
| //按位或
^ //按位異或
注:他們的操作數必須是整數。      
#include <stdio.h>
int main()
{
int num1 = 1;
int num2 = 2;
num1 & num2;
num1 | num2;
num1 ^ num2;
return 0;
}      
//不能建立臨時變量(第三個變量),實作兩個數的交換。
#include <stdio.h>
int main()
{
int a = 10;
int b = 20;
a = a^b;
b = a^b;
a = a^b;
printf("a = %d b = %d\n", a, b);
return 0;
}      
//編寫代碼實作:求一個整數存儲在記憶體中的二進制中1的個數。
參考代碼:
//方法1
#include <stdio.h>
int main()
{
int num = 10;
int count= 0;//計數
while(num)
{
if(num%2 == 1)
count++;
num = num/2;
}
printf("二進制中1的個數 = %d\n", count);
return 0;
}
//思考這樣的實作方式有沒有問題?

//方法2:
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//計數
for(i=0; i<32; i++)
{
if( num & (1 << i) )
count++;
}
printf("二進制中1的個數 = %d\n",count);
return 0;
}
//思考還能不能更加優化,這裡必須循環32次的。

//方法3:
#include <stdio.h>
int main()
{
int num = -1;
int i = 0;
int count = 0;//計數
while(num)
{
count++;
num = num&(num-1);
}
printf("二進制中1的個數 = %d\n",count);
return 0;
}
//這種方式是不是很好?達到了優化的效果,但是難以想到。      

5.指派操作符

int weight = 120;//體重
weight = 89;//不滿意就指派
double salary = 10000.0;
salary = 20000.0;//使用指派操作符指派。
指派操作符可以連續使用,比如:
int a = 10;
int x = 0;
int y = 20;
a = x = y+1;//連續指派
這樣的代碼感覺怎麼樣?
那同樣的語義,你看看:
x = y+1;
a = x;
這樣的寫法是不是更加清晰爽朗而且易于調試。      
//這些運算符都可以寫成複合的效果。
+=
-=
*=
/=
%=
>>=
<<=
&=
|=
^=      
int x = 10;
x = x+10;
x += 10;//複合指派
//其他運算符一樣的道理。這樣寫更加簡潔。      

6.單目操作符

! 邏輯反操作
- 負值
+ 正值
& 取位址
sizeof 操作數的類型長度(以位元組為機關)
~ 對一個數的二進制按位取反
-- 前置、後置--
++ 前置、後置++
* 間接通路操作符(解引用操作符)
(類型) 強制類型轉換      
#include <stdio.h>
int main()
{
int a = -10;
int *p = NULL;
printf("%d\n", !2);
printf("%d\n", !0);
a = -a;
p = &a;
printf("%d\n", sizeof(a));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof a);//這樣寫行不行?
printf("%d\n", sizeof int);//這樣寫行不行?
return 0;
}      
#include <stdio.h>
void test1(int arr[])
{
printf("%d\n", sizeof(arr));//(2)
}
void test2(char ch[])
{
printf("%d\n", sizeof(ch));//(4)
}
int main()
{
int arr[10] = {0};
char ch[10] = {0};
printf("%d\n", sizeof(arr));//(1)
printf("%d\n", sizeof(ch));//(3)
test1(arr);
test2(ch);
return 0;
}
問:
(1)、(2)兩個地方分别輸出多少?
(3)、(4)兩個地方分别輸出多少?      
//++和--運算符
//前置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = ++a;
//先對a進行自增,然後對使用a,也就是表達式的值是a自增之後的值。x為11。
int y = --a;
//先對a進行自減,然後對使用a,也就是表達式的值是a自減之後的值。y為10;
return 0;
}
//後置++和--
#include <stdio.h>
int main()
{
int a = 10;
int x = a++;
//先對a先使用,再增加,這樣x的值是10;之後a變成11;
int y = a--;
//先對a先使用,再自減,這樣y的值是11;之後a變成10;
return 0;
}      

7.關系操作符

>
>=
<
<=
!= 用于測試“不相等”
== 用于測試“相等”      

8.邏輯操作符

&& 邏輯與
|| 邏輯或      
1&2----->0
1&&2---->1
1|2----->3
1||2---->1      
#include <stdio.h>
int main()
{
int i = 0,a=0,b=2,c =3,d=4;
i = a++ && ++b && d++;
//i = a++||++b||d++;
printf("a = %d\n b = %d\n c = %d\nd = %d\n", a, b, c, d);
return 0;
}
//程式輸出的結果是什麼?      

9.條件操作符

exp1 ? exp2 : exp3      
1.
if (a > 5)
b = 3;
else
b = -3;
轉換成條件表達式,是什麼樣?
2.使用條件表達式實作找兩個數中較大值。      

10.逗号操作符

//代碼1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表達式
c是多少?
//代碼2
if (a =b + 1, c=a / 2, d > 0)
//代碼3
a = get_val();
count_val(a);
while (a > 0)
{
//業務處理
a = get_val();
count_val(a);
}
如果使用逗号表達式,改寫:
while (a = get_val(), count_val(a), a>0)
{
//業務處理
}      

11.下标引用、函數調用和結構成員

int arr[10];//建立數組
arr[9] = 10;//實用下标引用操作符。
[ ]的兩個操作數是arr和9。      
#include <stdio.h>
void test1()
{
printf("hehe\n");
}
void test2(const char *str)
{
printf("%s\n", str);
}
int main()
{
test1(); //實用()作為函數調用操作符。
test2("hello bit.");//實用()作為函數調用操作符。
return 0;
}      
#include <stdio.h>
struct Stu
{
char name[10];
int age;
char sex[5];
double score;      
};
void set_age1(struct Stu stu)
{
stu.age = 18;
}
void set_age2(struct Stu* pStu)
{
pStu->age = 18;//結構成員通路
}
int main()
{
struct Stu stu;
struct Stu* pStu = &stu;//結構成員通路
stu.age = 20;//結構成員通路
set_age1(stu);
pStu->age = 20;//結構成員通路
set_age2(pStu);
return 0;
}
//執行個體1
char a,b,c;
...
a = b + c;
比      

12.表達式求值

//執行個體1
char a,b,c;
...
a = b + c;      
//負數的整形提升
char c1 = -1;
變量c1的二進制位(補碼)中隻有8個比特位:
1111111
因為 char 為有符号的 char
是以整形提升的時候,高位補充符号位,即為1
提升之後的結果是:
11111111111111111111111111111111
//正數的整形提升
char c2 = 1;
變量c2的二進制位(補碼)中隻有8個比特位:
00000001
因為 char 為有符号的 char
是以整形提升的時候,高位補充符号位,即為0
提升之後的結果是:
00000000000000000000000000000001
//無符号整形提升,高位補0      
//執行個體1
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if(a==0xb6)
printf("a");
if(b==0xb600)
printf("b");
if(c==0xb6000000)
printf("c");
return 0;
}      
//執行個體2
int main()
{
char c = 1;
printf("%u\n", sizeof(c));
printf("%u\n", sizeof(+c));
printf("%u\n", sizeof(-c));
return 0;
}      
//算術轉換
long double
double
float
unsigned long int
long int
unsigned int
int