目錄
1. ++、--操作
1.1前置++(--),后置++(--)
1.2深刻理解 a++
1.3 補充
1.4 運算式匹配,貪心演算法
2.1 2/(-2) 的值是多少,深度理解取余/取模運算
2.1.1 關于“取整”你得知道
2.1.2 向0取整
2.1.3 向-∞取整
2.1.4 向+∞取整
2.1.5 四舍五入
2.2 聊聊取模
2.2.2 是什么決定了這種現象
2.2.3 取余和取模一樣嗎?
2.2.4 如果參與運算的資料,不同符號呢?
2.2.5 總結
本章節文章是作者通過觀看《C語言深度剖析》等各種資料總結的精華,基礎部分省略了不少,是為了讓大家能夠更加深入了解C語言的魅力!因為為了避免與之前的文章發生贅述,所以就直接講作者認為的精華部分哈!現在正文開始!
誰都不能阻擋你成為更優秀的人,
1. ++、--操作
1.1前置++(--),后置++(--)
1.2深刻理解 a++
#include <stdio.h>
#include <windows.h>
int main()
{
int a = 0xDD;
int b = a++; //有b接收,那么a的先使用是將a的值(內容),放到b中
int c = 0xEE;
c++; //沒有接收方,那么"先使用",如何理解?
system("pause");
return 0;
}
在沒有人用的時候(沒有接收方),前置和后置是一樣的,
結論:a++完整的含義是先使用,在自增,如果沒有變數接收,那么直接自增(或者所謂使用,就是讀取進暫存器,然后沒有然后=,=),
1.3 補充
本質:是因為上面運算式的"計算路徑不唯一"(為什么?編譯器識別運算式,是同時加載至暫存器,還是分批加載,完全不確定)導致的,
1.4 運算式匹配,貪心演算法

printf("%d\n", a++++ + b); //自動匹配失敗
printf("%d\n", a++ + ++b); //自行分離匹配,非常不推薦,不過能看出空格的好處
就是你連著++--的時候計算機會自行匹配,但不一定會匹配正確
原則就是會盡量往左邊匹配更多的符號(貪心),
2.1 2/(-2) 的值是多少,深度理解取余/取模運算
2.1.1 關于“取整”你得知道
2.1.2 向0取整
#include <stdio.h>
#include <windows.h>
int main()
{
//本質是向0取整
int i = -2.9;
int j = 2.9;
printf("%d\n", i); //結果是:-2
printf("%d\n", j); //結果是:2
system("pause");
return 0;
}
有一個trunc取整函式,同作用


2.1.3 向-∞取整

#include <stdio.h>
#include <math.h> //因為使用了floor函式,需要添加該頭檔案
#include <windows.h>
int main()
{
//本質是向-∞取整,注意輸出格式要不然看不到結果
printf("%.1f\n", floor(-2.9)); //-3
printf("%.1f\n", floor(-2.1)); //-3
printf("%.1f\n", floor(2.9)); //2
printf("%.1f\n", floor(2.1)); //2
system("pause");
return 0;
}

2.1.4 向+∞取整
#include <stdio.h>
#include <math.h>
#include <windows.h>
int main()
{
//本質是向+∞取整,注意輸出格式要不然看不到結果
printf("%.1f\n", ceil(-2.9)); //-2
printf("%.1f\n", ceil(-2.1)); //-2
printf("%.1f\n", ceil(2.9)); //3
printf("%.1f\n", ceil(2.1)); //3
system("pause");
return 0;
}

2.1.5 四舍五入
#include <stdio.h>
#include <math.h>
#include <windows.h>
int main()
{
//本質是四舍五入
printf("%.1f\n", round(2.1));
printf("%.1f\n", round(2.9));
printf("%.1f\n", round(-2.1));
printf("%.1f\n", round(-2.9));
system("pause");
return 0;
}
結論:浮點數(整數/整數),是有很多的取整方式的,
PS:C默認向0取整,
2.2 聊聊取模
取模概念:如果 a 和 d 是兩個自然數, d 非零,可以證明存在兩個唯一的整數 q 和 r ,滿足 a = q * d + r 且 0 ≤ r < d ,其中, q被稱為商,r 被稱為余數,
我們平時都是用的正數的取模,所以并沒有發現什么問題,但是想一想,我們如果遇到負數的取模呢?
1
#include <stdio.h>#include <windows.h>int main (){int a = 10 ;int d = 3 ;printf ( "%d\n" , a % d ); // 結果是 1// 因為: a=10,d=3,q=3,r=1 0<=r<d(3)// 所以: a = q*d+r -> 10=3*3+1system ( "pause" );return 0 ;}
#include <stdio.h>#include <windows.h>int main (){int a = - 10 ;int d = 3 ;//printf("%d\n", a/d); //C 語言中是 -3 ,很好理解printf ( "%d\n" , a % d );system ( "pause" );return 0 ;}
但是2在python中我們發現是2?
結論:很顯然,上面關于取模的定義,并不能滿足語言上的取模運算
因為在 C 中,現在 - 10 % 3 出現了負數,根據定義:滿足 a = q * d + r 且 0 ≤ r < d , C 語言中的余數,是不滿足定義的, 因為,r < 0 了,故,大家對取模有了一個修訂版的定義:如果 a 和 d 是兩個自然數, d 非零,可以證明存在兩個唯一的整數 q 和 r ,滿足 a = q * d + r , q 為整數,且 0 ≤ | r | < | d | ,其中, q 被稱為商, r 被稱為余數,有了這個新的定義,那么 C 中或者 Python 中的 “ 取模 ” ,就都能解釋了,解釋 C : - 10 = ( - 3 ) * 3 + ( - 1 )解釋 Python : - 10 = ( ? ) * 3 + 2 , 其中,可以推到出來 , '?' 必須是-4 ( 后面驗證 ). 即 - 10 = (- 4 ) * 3 + 2 ,才能滿足定義,所以,在不同語言,同一個計算運算式,負數 “ 取模 ” 結果是不同的,我們可以稱之為分別叫做正余數 和 負余數
2.2.2 是什么決定了這種現象
由上面的例子可以看出,具體余數 r 的大小,本質是取決于商 q 的,而商,又取決誰呢?取決于除法計算的時候,取整規則,簡單說,要先算商,再算余數,而商的取法前面說了4種,這就要看編譯器,
2.2.3 取余和取模一樣嗎?
這兩個并不能嚴格等價 ( 雖然大部分情況差不多 ) 取余或者取模,都應該要算出商,然后才能得出余數,本質 1 取整:取余:盡可能讓商,進行向0取整,取模:盡可能讓商,向-∞方向取整,故:C中%,本質其實是取余,Python 中 % ,本質其實是取模,理解鏈:對任何一個大于 0 的數, 對其進行0向取整和-∞取整 ,取整方向是一致的,故取模等價于取余對任何一個小于 0 的數, 對其進行0向取整和-∞取整 ,取整方向是相反的,故取模不等價于取余同符號資料相除,得到的商,一定是正數(正數 vs 正整數),即大于 0 !故,在對其商進行取整的時候,取模等價于取余,本質 2 符號:參與取余的兩個資料,如果同符號,取模等價于取余
2.2.4 如果參與運算的資料,不同符號呢?
#include <stdio.h>
#include <windows.h>
int main()
{
printf("%d\n", -10 / 3); //結果:-3
printf("%d\n\n", -10 % 3); //結果:-1 為什么? -10=(-3)*3+(-1)
printf("%d\n", 10 / -3); //結果:-3
printf("%d\n\n", 10 % -3); //結果:1 為什么?10=(-3)*(-3)+1
system("pause");
return 0;
}
好像不是這樣的,為什么呢?
重新看看定義:如果 a 和 d 是兩個自然數, d 非零,可以證明存在兩個唯一的整數 q 和 r ,滿足 a = q * d + r , q 為整數,且 0 ≤ | r | < | d | ,其中, q 被稱為商, r 被稱為余數,a = q * d + r 變換成 r = a - q * d 變換成 r = a + ( - q * d )對于: x = y + z ,這樣的運算式, x 的符號 與 | y | 、 | z | 中大的資料一致,而 r = a + ( - q * d ) 中, | a | 和 |- q * d | 的絕對值誰大,取決于商 q 的取整方式,c 是向 0 取整的,也就是 q 本身的絕對值是減小的,如:- 10 / 3 =- 3.333 . 33 向 0 取整 - 3. a =- 10 | 10 | , - q * d =- ( - 3 ) * 3 = 9 | 9 |10 /- 3 =- 3.333 . 33 向 0 取整 - 3. a = 10 | 10 | , - q * d =- ( - 3 ) * ( - 3 ) =- 9 | 9 |絕對值都變小了python 是向 - ∞ 取整的,也就是 q 本身的絕對值是增大的,- 10 / 3 =- 3.333 . 33 '//' 向 - ∞ 取整 - 4. a =- 10 | 10 | , - q * d =- ( - 4 ) * 3 = 12 | 12 |10 /- 3 =-- 3.333 . 33 '//' 向 - ∞ 取整 - 4. a = 10 | 10 | , - q * d =- ( - 4 ) * ( - 3 ) =- 12 | 12 |絕對值都變大了結論:如果參與取余的兩個資料符號不同,在 C 語言中 ( 或者其他采用向 0 取整的語言如: C ++ , Java ) ,余數符號,與被除數相同,
2.2.5 總結
- 浮點數(或者整數相除),是有很多的取整方式的,
- 如果a和d是兩個自然數,d非零,可以證明存在兩個唯一的整數 q 和 r,滿足 a = q*d + r , q 為整數,且0 ≤ |r| < |d|,其中,q 被稱為商,r 被稱為余數,
- 在不同語言,同一個計算運算式,“取模”結果是不同的,我們可以稱之為分別叫做正余數 和 負余數,
- 具體余數r的大小,本質是取決于商q的,而商,又取決于除法計算的時候,取整規則,
- 取余vs取模: 取余盡可能讓商,進行向0取整,取模盡可能讓商,向-∞方向取整,
- 參與取余的兩個資料,如果同符號,取模等價于取余,
- 如果參與取余的兩個資料符號不同,在C語言中(或者其他采用向0取整的語言如:C++,Java),余數符號,與被除數相同,(因為采用的向0取整)
今天的內容就到這里了哈!!!
要是認為作者有一點幫助你的話!
就來一個點贊加關注吧!!!當然訂閱是更是求之不得!
最后的最后謝謝大家的觀看!!!
你們的支持是作者寫作的最大動力!!!
下期見哈!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/382048.html
標籤:其他
下一篇:實踐專案:圖書館管理系統
