這章有很多要記得東西,比如操作符屬性表(未附),真的需要記憶。
操作符
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