目錄
六、單目操作符
七、逗號表達式
八、下標引用以及函數調用
8.1.下標引用
8.2.函數調用
九、結構體
9.1.結構體
9.1.1結構的聲明
9.1.2結構體的定義和初始化
9.2.結構成員訪問操作符
9.2.1直接訪問
9.2.2間接訪問
十、操作符的屬性
10.1.優先性
10.2.結合性
十一、整形提升
結語
六、單目操作符
!、 ++ 、 -- 、 & 、 * 、 + 、 - 、 ~ 、 sizeof 、 ( 類型 )
?上述操作符中,我們在前面都說過,只有&和*沒有提及,這兩個操作符我們會在指針章節詳細介紹。
七、逗號表達式
a1,a2,a3,.....an
逗號表達式,就是用多個逗號隔開的多個表達式。
它是按從左到右的順序依次執行。整個表達式的結果是最后一個表達式的結果。
eg:
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);
首先,從左到右依次執行 ,先是a>b,然后把b+10賦給a,a就變成了12,最后再將a+1的值賦給b,這個表達式的值就是整個表達式的值,也就是13,所以c為13。
八、下標引用以及函數調用
8.1.下標引用
我們在數組中曾見過這對中括號,是的,它的名字叫下標引用。
操作數:數組名+索引值
eg:
int arr[10];//創建數組
arr[9] = 10;//實?下標引?操作符。
[]的兩個操作數是arr和9。
8.2.函數調用
這個相信大家也不陌生。
操作數:函數名+參數
問:函數調用最少有幾個操作數?
答:一個,只需要一個函數名即可。
#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;
}
?接下來講點沒見過的。
九、結構體
我們今天只是簡單介紹,后面還會繼續詳細介紹結構體(又挖坑)。
9.1.結構體
結構是?些值的集合,這些值稱為成員變量。結構的每個成員可以是不同類型的變量,如:標量、數組、指針,甚?是其他結構體。
9.1.1結構的聲明
struct tag
{member-list;//成員列表
}variable-list //變量列表
?其中tag表述結構體名,花括號里面放著成員列表,也就是要描述對象的各種屬性。變量列表用來存放定義為該結構體類型的變量。
struct Stu
{char name[20];//名字int age;//年齡char sex[5];//性別char id[20];//學號
}; //分號不能丟
9.1.2結構體的定義和初始化
//代碼1:變量的定義
struct Point
{int x;int y;
}p1; //聲明類型的同時定義變量p1
struct Point p2; //定義結構體變量p2
//代碼2:初始化。
struct Point p3 = {10, 20};
struct Stu //類型聲明
{char name[15];//名字int age; //年齡
};
struct Stu s1 = {"zhangsan", 20};//初始化
struct Stu s2 = {.age=20, .name="lisi"};//指定順序初始化
//代碼3
struct Node
{int data;struct Point p;struct Node* next;
}n1 = {10, {4,5}, NULL}; //結構體嵌套初始化
struct Node n2 = {20, {5, 6}, NULL};//結構體嵌套初始化
9.2.結構成員訪問操作符
9.2.1直接訪問
使用方式:結構體變量?.?成員名
#include <stdio.h>
struct Point
{int x;int y;
}p = {1,2};
int main()
{printf("x: %d y: %d\n", p.x, p.y);return 0;
}
這個點很小,但是很有用!
9.2.2間接訪問
有的時候,我們得到的是結構體的地址,
使用方式:結構體指針(地址)->成員名
舉例如下:
#include <stdio.h>
struct Point
{int x;int y;
};
int main()
{struct Point p = {3, 4};struct Point *ptr = &p;ptr->x = 10;ptr->y = 20;printf("x = %d y = %d\n", ptr->x, ptr->y);return 0;
}
綜合舉例如下:
#include <stdio.h>
#include <string.h>
struct Stu
{char name[15];//名字int age; //年齡
};
void print_stu(struct Stu s)
{printf("%s %d\n", s.name, s.age);
}
void set_stu(struct Stu* ps)
{strcpy(ps->name, "李四");ps->age = 28;
}
int main()
{struct Stu s = { "張三", 20 };print_stu(s);set_stu(&s);print_stu(s);return 0;
}
十、操作符的屬性
10.1.優先性
參考鏈接:C 運算符優先級 - cppreference.com?
? ?圓括號( () )? ?增運算符( ++ ),?減運算符( -- )? 單?運算符( + 和 - )? 乘法( * ),除法( / )? 加法( + ),減法( - )? 關系運算符( < 、 > 等)? 賦值運算符( = )由于圓括號的優先級最?,可以使?它改變其他運算符的優先級。?大概記住這些就夠了,其它可以現查表。
10.2.結合性
十一、整形提升
C語?中整型算術運算總是?少以缺省整型類型的精度來進?的。
而為了獲得這種精度,表達式中的字符型和短整型在使用之前就會被轉換為整形,這種轉換叫整形提升?。
表達式的整型運算要在CPU的相應運算器件內執?,CPU內整型運算器(ALU)的操作數的字節長度?般就是int的字節?度,同時也是CPU的通?寄存器的?度。因此,即使兩個char類型的相加,在CPU執?時實際上也要先轉換為CPU內整型操作數的標準長度。通?CPU(general-purpose CPU)是難以直接實現兩個8?特字節直接相加運算(雖然機器指令中可能有這種字節相加指令)。所以,表達式中各種?度可能?于int?度的整型值,都必須先轉換為int或unsigned int,然后才能送?CPU去執?運算。
char a,b,c;
...
a = b + c;
?首先,b和c被提升為整形然后運算賦給a。
如何進行整形提升呢?
1. 有符號整數提升是按照變量的數據類型的符號位來提升的2. ?符號整數提升,?位補0
//負數的整形提升
char c1 = -1;
變量c1的?進制位(補碼)中只有8個?特位:
1111111
因為 char 為有符號的 char
所以整形提升的時候,?位補充符號位,即為1
提升之后的結果是:
11111111111111111111111111111111
//正數的整形提升
char c2 = 1;
變量c2的?進制位(補碼)中只有8個?特位:
00000001
因為 char 為有符號的 char
所以整形提升的時候,?位補充符號位,即為0
提升之后的結果是:
00000000000000000000000000000001
//?符號整形提升,?位補0
結語
有很多朋友問為什么以武器大師來做標題,這里結尾給大家解釋一下,因為我覺得它就像不同人手中不同的工具,比如算數操作符像是數學家手中的計算器,關系操作符像是偵探手中的證據對比工具,邏輯操作符類似于法官手中的判決書,位操作符更像電路工程師的開關和轉換器,賦值操作符像是建筑師手中的藍圖和材料......
其實我們學習每樣東西都是,雖然有時很抽象,但是我們總能找到解決辦法。
“細想全是問題,去做全是答案”。