當前位置:
首頁 > 知識 > 理解C語言變數三要素沒那麼難

理解C語言變數三要素沒那麼難

1.1 變數與指針

>>1.1.1 變數

1. 變數的三要素

「變數的值」保存在內存的某個地方,如同使用門牌號確定地址一樣,在內存中也給變數分配門牌號。在C的內存世界中,門牌號被稱為變數的地址。即從變數中取值就是通過變數名找到相應的存儲地址,然後讀取該存儲單元中的值,而寫一個變數就是將變數的值存放到與之相應的存儲地址中去。

通常將用於存儲數據的「位置」稱為對象,當將一個對象看作一個黑盒子時,如果將指定類型的值放入這個盒子,則需要使用一個名字才能訪問一個對象。假設命名後的對象稱為變數iNum,它有特定的類型int,類型決定將什麼賦給對象,比如,將0x64賦給int類型變數iNum,以及可以使用的操作,比如,多個int類型數據可以使用「*」操作進行乘法運算。

零基礎小白到大神之路,歡迎加裙 四八七八七五零零四,群里有免費C++課程,還有大量乾貨哦

如果有以下聲明:

int iNum = 0x64; // 聲明iNum為int型變數

其中,int為變數iNum的類型,iNum為變數名,0x64為變數iNum的值。當聲明一個變數時,編譯器會根據變數的類型預留足夠的內存空間。變數的存儲空間是系統自動分配的,但此存儲空間不會在程序的整個生命周期中永遠存在。

值是被解釋為一個類型的內存中的一組比特(bit)。計算機內存不知道值的類型,只是將它保存起來。因此只有決定內存如何解釋時,內存中的bit才有意義。比如,3.0的含義是什麼?只有使用單位時,才會決定3.0的含義。

聲明是命名一個對象的一條語句,定義是為一個對象分配內存空間的聲明,一個定義通常會提供一個初始值。比如:

int length = 20;

int width = 40;

int area = length + width;

>>>2. 變數的地址與指針

當你聲明一個變數時,底層會分配一定大小的內存存儲變數的信息。而分配多少內存,則在編譯期就已經確定了。為了能夠訪問無限量的內存,C語言使用地址&操作符返回操作數的地址。當&運算符作用於一個變數時,則返回的是變數的地址。對於變數iNum來說,&iNum就是變數iNum的內存地址,詳見圖 1.3。

圖 1.3內存、變數與地址

從變數中取值就是通過變數名iNum找到與之相應的存儲地址&iNum,然後讀取存儲在該地址中的值0x64,寫一個變數iNum就是將變數的值0x64存放到與之相應的存儲地址&iNum中去。顯然,不能在&iNum前面再加「&」運算符,因為&iNum已經不是變數了,而是一個不可修改的整型常量,即0x22FF74。

為了便於描述變數,C語言將用於存儲變數的內存地址的&iNum抽象為指向變數iNum的指針。這些地址之所以稱為指針,因為它是「指向」一個變數的。只需指出變數的地址(不是變數名),就可以確定該變數。即指針的本質就是一個內存的地址,它指向內存的某個位置。指針是一個地址,其強調的是當使用指針時要想到它是「內存地址」。實際上,在現實世界裡既沒有變數也沒有指針,變數和指針是對程序中的數據和存儲空間的抽象。

為了展示變數的地址與變數的值的對應關係,最好的方式是直接列印輸出。比如,輸入2個整數,交換兩者的值後輸出,即先將輸入的整數存入變數iNum1和iNum2,然後交換,詳見程序清單 1.3。注意,不同的編譯環境(不同的編譯器、同一編譯器的不同版本、編譯參數不同等),變數的地址值(0x22FF74)可能會不一樣。

程序清單 1.3變數交換范常式序

1 #include

2 int main(int argc, char *argv[])

3 {

4 int iNum1, iNum2, temp;

5

6 scanf("%x%x", &iNum1, &iNum2);

7 printf("%x, %xn", &iNum1, &iNum2);

8 printf("%x, %xn", iNum1, iNum2);

9 temp = iNum1; iNum1 = iNum2; iNum2 = temp;

10 printf("%x, %xn", &iNum1, &iNum2);

11 printf("%x, %xn", iNum1, iNum2);

12 return 0;

13 }

請讀者仔細觀察,為何要在程序清單 1.3(6)中的變數前添加「&」?程序清單 1.3(6~7)中的&iNum1、&iNum2有什麼區別?

左值和右值

為了理解某些操作符的限制,標準C發明了L-value和R-value兩個名詞。雖然其被解釋為左值和右值,但實際上是一個美麗的誤會。因為L-value是指「locator value」不是「left vaue」,其字面意思是「(在內存中)有特定位置的值」,即內存的索引值——地址。而R-value是指「read value」不是「right value」,其字面意思是「可讀的值」。比如:

int iNum = 0x64;

雖然編譯器為變數iNum分配了地址(L-value),其L-value是在編譯期就確定了的地址「&iNum」。而R-value是存儲在變數iNum中的值0x64,但其賦值是在運行時。

儘管iNum有地址,但iNum++表達式沒有地址,因此iNum只有R-value。雖然任何表達式都有R-value,但只有部分表達式有L-value。

>>>3. 變數的存儲

如果數據從低位到高位用最左位和最右位表述,則一定會產生歧義,因此使用最低有效位(Least Significant,LSB)和最高有效位(Most Significant,MSB)分別表示數據的最低位和最高位。對於有符號數來說,最高有效位就是符號位。假設變數的值用二進位表示為:

D31D30D29D28D27D26D25D24D23D22D21D20D19D18D17D16D15D14D13D12D11D10D9D8D7D6D5D4D3D2D1D0

即數據的MSB符號位為D31,LSB為D0。

根據數據中各個位元組在連續位元組序列中排列順序的不同,分為2種排列方式:大端和小端。如果A中存放的是數據的MSB最高有效位,即為大端模式(詳見圖1.4(a));如果A中存放的是數據的LSB最低有效位,即為小端模式(詳見圖1.4(b))。注意,CPU究竟採用何種存儲模式取決於硬體,與編譯器無關,Intel x86計算機的CPU就是小端模式。當計算機對存儲單元進行編號時,則每個地址編號中只存放一個位元組。C規定多位元組的int、float、doublie類型變數必須佔用相鄰的存儲單元,且將存儲單元的最低地址作為變數的地址。假設一個32位變數佔用地址為A、A+1、A+2和A+3存儲單元,則變數的地址為A。如果有「int iNum = 0x64;」,那麼A中到底存放的是4個位元組00H、00H、00H、64H中的哪個位元組呢?

圖1.4 32位變數的存儲

>>>4. 變數類型別名

大家可能知道,作者的名字叫周立功,但作者在家裡還有一個別名——小兵,其實都是同一個人。同樣如此,我們也可以給變數的類型取一個別名。如果在「int iNum;」定義前添加typedef,即:

typedef int iNum;

此時,iNum等同於int類型。為了便於理解,將iNum替換成INT32。比如:

typedef int INT32;

typedef的用途是聲明類型的別名,它只是為某個已經存在的類型增加了一個新的名字。那麼利用這一特性,就可以定義變數了。比如:

INT32 a; // 定義int型變數a

除此之外,INT32還可用於類型轉換,比如:

float b;

(INT32)b; // 將其它的類型b轉換為整型

為何還要為int再取一個名稱呢?主要是為了提高程序的可移植性。比如,某種微處理器的int為16位,long為32位。如果要將該程序移植到另一種體系結構的微處理器,假設其int為32位,long為64位,而只有short才是16位的,因此必須將程序中的int全部替換為short,long全部替換為int,不僅修改工作量巨大且容易出錯。如果在程序中全部用新取的名稱,那麼只需要修改定義的這些新名稱。即只要將以前的:

typedef int INT16;

typedef long INT32;

替換成:

typedef short INT16;

typedefintINT32;

在編程中使用typedef的好處,除了為變數取一個簡單易記且意義明確的新名稱之外,其最主要的作用是使用typedef構造新的數據類型。而不要誤認為typedef的作用僅僅是簡化更複雜的類型聲明,將在後續的章節中詳細闡述。

由此可見,C語言變數的內涵包括3個要素:變數的類型、變數的值和變數的地址。

變數的類型:即變數存儲的數據的類型,程序如何解釋變數保存的數據。比如,int類型變數,任何引用存儲在變數中的數據都被程序解釋為整數。數據類型分為基本類型(字元型與數值型)、構造類型(數組型、結構體型、聯合體型、枚舉型與位域型)、指針類型與void *類型,所有其它的類型都是通過組合的方式從基本類型構造而來的。

變數的值:程序根據變數的類型解釋存儲在變數中的數據,數據分為不可修改的常量的值和可以修改的變數的值。

變數的地址:即變數在內存中的位置,當利用一個變數存儲一個數據時,則程序將數據存儲到變數的地址所指示的存儲單元中。

>>1.1.2 值的表示形式

>>>1. 計算機的數據單位

在計算機中,常用的數據單位有位、位元組、半字和字,微處理器根據位數的不同支持8位位元組、16位半字或32位字的數據類型。

位(bit):它是一個二進位數的位,位是計算機數據的最小單位,一個位只有0和1 兩種狀態(21)。為了表示更多的信息,必須將更多位組合起來使用,比如,兩位二進位數就有00、01、10、11四種狀態(22),依此類推。

位元組(Byte):一個8位二進位數稱為一個位元組,即1B=8bit,那麼一個位元組就可以表示0-255種狀態或十六進位0~FF之間的數,8位微處理器的數據是以位元組方式存儲的。

半字:從偶數地址開始連續的2個位元組構成一個半字,半字的數據類型為2個連續的位元組,有些32位微處理器的數據是以半字方式存儲的,比如,32位ARM微處理器支持的Thumb指令的長度剛好是一個半字。

字:以能被4整除的地址開始的連續的4個位元組構成1個字,字的數據類型為4個連續的位元組,32位微處理器的數據全部支持以字方式存儲的格式。

>>>2. 負數的表示法

當需要帶符號的signed整數時,雖然可以單獨指定某位為1表示「符號」,但計算機不會簡單地將「符號位」加到一個數上去。計算機如何存儲負數?

由於計算機中無減法器,那麼最好的方法就是將減法也通過加法器來完成。為了解決負數在計算機中的存儲問題,這裡有必要引入補碼的概念。可以舉個例子說明一下,指針式鐘錶,假如要將時針從5點拔到2點,有2種拔法,一種是逆時針拔3個時格,相當於5減3等於2;另一種拔法是順時針拔9個時格,相當於5加9也等於2,即對於這種模為12計數制來說,9和3互補,9是3的補碼,反之亦然。對於剛才時鐘的拔法可以寫出如下算式:

5-3 = 5-(12-9) = 5+9-12 = 2

當約定用最高有效位作為符號位來確定singned整數後,即可使用「補碼」將符號位和其它位統一處理,那麼減法也就可以當作加法來處理了。求負數補碼的規則如下:

當一個n位二進位數的原碼為N時,它的補碼定義為(N)補=2n-N

當一個8位二進位數的原碼為1時,其補碼定義為 (28-1)10 = (255)10 = (1111 1111)2,即將該數絕對值原碼所有為取反,然後將結果加1,其計算過程為:

當用補碼錶示兩個數相加時,如果最高位(符號位)有進位,則進位位被捨棄。正數的補碼與其原碼一樣,而負數的補碼,其符號位為1,將該數絕對值原碼的所有位取反,然後將結果加1。由此可見,在計算機中數值一律用補碼錶示(存儲),比如,計算8位二進位數減法(圖 1.5):

圖 1.5算式

>>>3. 溢出

當一個n位二進位數用於表示unsigned數時,其可能的取值範圍為0~2n-1,比如,一個8位數的範圍在0~28-1(0~255)之間。假設在一個8位unsigned數248上加10,那麼需要9位才能存儲正確的結果258,而正確結果258與實際結果2(最低8位有效位)之間的差(256)對應的第9位被丟棄了,因此它不能存儲在結果中。

當用於表示signed數時,則只有一半用於正值,一半用於負值,因此n位二進位數的補碼帶符號數的整個取值範圍為-2n~2n-1,即一個8位二進位數可以保存一個範圍在-27~27-1(-128~127)之間的帶符號值。因此對於signed數,當加上具有不同符號的數或減去具有相同符號的數時,將永遠不會溢出。如果將兩個具有相同符號的整數相加,或將兩個具有不同符號的整數相減時,將可能發生溢出。比如,從一個8位signed整數-120中減去20:

而其正確的結果-140需要9位才能存儲,因此正確結果-140與實際結果116(最低8位有效位)之間的差(256)對應的第9位被丟棄了,它不能存儲在結果中。由於整數數據類型的溢出是悄悄發生的,因此一定要注意每個變數可能的取值範圍。

>>>4. 定點數與浮點數

(1)定點格式

下面將從整數的二進位表示開始,這裡的整數被數學家稱為「自然數」,即計算機程序員口中的「正整數」。此外,數學家還定義了用兩個整數的比值表示的一類數,稱為有理數或。比如,3/4是一個有理數,也可以將3/4表示為十進位小數0.75。儘管可以將它寫成十進位數的形式,但它實際上代表一個分數,即75/100。

無理數更是一些奇特的數,比如,2的平方根等。它們不能表示為兩個整數的比,即其小數部分是無窮的,而且毫無規律。到此為止討論的所有數——有理數和無理數都統稱為實數。使用實數定義它們的目的是為了將其與虛數區別開來,虛數是負數的平方根,而實數與虛數又構成了複數。

通常人們習慣將數字看成連續的,任意給出的兩個有理數,都可以找出一個位於它們之間的數,實際上只要取這兩個數的平均值即可。但計算機卻無能為力,因為二進位中的每一位非0即1,兩者之間沒有任何數。這一特點決定了計算機只能處理離散數據,因此二進位數的位數直接決定了所能表示的離散數值的個數,比如,對於8位數來說,所能表示的自然數的範圍為0~255。如果要在計算機中存儲4.5這個數,則需要選擇新的表示方式。

小數可以表示二進位數嗎?最簡單的方法是使用BCD碼(二進位編碼的十進位數)。通常將兩個BCD數一起使用,這種方式稱為壓縮BCD。由於2的補數不和BCD數一起使用,則壓縮BCD需要增加1位用於標識數的正負,該位被稱作符號位。雖然用一個位元組保存某個特定的BCD數是非常方便的,但要為這個短小的符號位犧牲4位或8位的存儲空間。假設計算機程序要處理的錢款數目在+/-100萬之間,則表示前的數目的範圍為:

-9,999,999.99 ~ 99,999,999.99

因此保存在存儲器中的一筆錢的金額都需要5位元組。比如,-4,325,120.25可以表示為:

0001 0100 0011 0010 0101 0001 0010 0000 0010 0101

將每個位元組轉換成十六進位數,則上面的數可以等價地表示為14H 32H 51H 20H 25H,最左邊的半個位元組所構成的1用於指明該數是負數,這個1即符號位。如果這半個位元組所構成的數是0,則說明該數是整數。組成該數的每一個數字都需要用4位表示,從十六進位的表示形式中可以很直觀地看到這一點。如果將數的範圍擴大,則需要更多的位元組來實現。

這種基於二進位的存儲和標記方式被稱為定點格式,所謂的「定點」是指小數點的位置總是在數的某個特定位置。但在表示非常大或非常小的數時,使用定點格式數是不合適的。因此科學家和工程師喜歡使用一種稱為「科學計數法」的方法記錄這類較大或較小的數,利用這種計數系統可以更好地在計算機中存儲這些數。

採用科學計數法表示的數可以分為兩部分,其中的指數部分用於表示10的幾次冪,指數可以表示小數點相對於有效數移動的距離。為了便於操作,規定有效數的取值範圍是大於或等於1而小於10。比如,4.9×1011這種寫法被稱為科學計數法的規範化。這裡需要說明,指數的正負性只是表明了數的大小,它不能指明數本身的正負性。

(2)浮點格式

在計算機中,對於小數的存儲方式,除了定點格式外還有一種選擇,它被稱為浮點格式。因為浮點格式是基於科學計數法的,所以它是存儲極大或極小數的理想方式。但計算機的浮點格式是藉助二進位數實現的科學計數法形式,因此需要先了解如何用二進位表示小數。

在二進位數中,二進位小數點右邊的數字和2的負整數次冪相關。比如,將101.1101轉換為十進位數為:

1×4+0×2+1×1+1÷2+1÷4+0÷8+1÷16

將乘數和除數用2的整數次冪替換,即:

1×22+0×21+1×20+1×2-1+1×2-2+0×2-3+1×2-4

2的負整數次冪等於從1開始反覆除以2,即:

1×4+0×2+1×1+1×0.5+1×0.25+0×0.125+1×0.0625

經過計算後得出101.1101與十進位數5.8125是相等的。

在二進位的科學計數法中,規範化的有效數應該大於或等於1且小於10(十進位的2),則101.1101的規範格式為1.0111011×22,這個規則暗示這樣一個有趣的現象,在規範化的二進位浮點數中,小數點的左邊只有一個1,除此之外沒有其它數字。

單精度格式

在計算機中處理浮點數所遵循的標準是由IEEE於1985年制定的,IEEE浮點數標準定義了兩種基本格式:以2位元組表示的單精度格式和8位元組表示的雙精度格式。單精度格式的4個位元組分為三個部分:1位符號位(0代表整數,1代表負數),8位用做指數,最後的23位用做有效數。下面給出單精度格式的三部分的劃分方式,其中有效數的最低位在最右邊:

對於二進位科學計數法的規範格式,其有效數的小數點左邊有且僅有一個1,而在IEEE浮點數標準中,這一位沒有分配存儲空間。僅存儲有效數的23位小數部分,儘管存儲的只有23位,但仍稱其精度為24位,將在下面的內容中體會24位精度的含義。

8位指數部分的取值範圍為0~255,稱為偏移指數,它的意思是——對於有符號指數,為了確定其實際所代表的的值必須從指數中減去一個值——稱為偏移量。對於單精度浮點數,其偏移量為127。如果指數的取值範圍為0~254,那麼對於一個特定的數,可以用s(符號位)、e(指數)和f(有效數)來描述。即:

(-1)s×1.f×2e-127

其中,-1的s次冪是數學上所採用的一種巧妙的方法,其含義為:如果s=0,則該數是正的(因為任何數的0次冪都是1);如果s=1,則該數是負的(因為-1的1次冪等於-1)。

表達式中的中間部分1.f,其含義為:1的後面是小數點,小數點後面跟著23位的有效數。1.f與2的冪相乘,其中的指數等於內存中的8位偏移量指數減去127。現在我們來討論一種特殊情況,其詳細介紹如下:

(a)如果e=0且f=0,則該數為0。通常將23位都設置為0以表示該數為0,當符號位置1時,這種數解釋為負0,而負0可以表示非常小的數。雖然這些數極小以至於不能在單精度格式下用數字和指數表示,但它仍然小於0。

(b)如果e=0且f≠0,雖然該數是合法的,但不符合規範。這類數可以表示為:

(-1)s×0.f×2-127

注意,在有效數中,小數點的左邊是0。

(c)如果e=255且f=0,則該數被解釋為無窮大或無窮小,其取決於符號位s的值。

(d)如果e=255且f≠0,則該值被解釋為「不是一個數」,通常被縮寫為NaN(not a number),NaN用於表示未知的數或非法操作的結果。

在單精度格式下,可以表示的規格化的最小正負二進位數為:

1.000000000000000000000002×2-126

在單精度格式下,可以表示規格化的最大正負二進位數為:

1.111111111111111111111112×2127

一般來說,10位二進位數可以近似地用3位十進位數表示,其含義是,如果將10都置為1,即十六進位的3FFH或十進位的1023,它近似地等於將十進位數的3位都置為9,即999,可以表示為210≈103,兩者的關係意味著:單精度浮點格式存放的24位二進位數大體上與7位的十進位數相等。因此可以說單精度浮點數提供24位的二進位精度或7位的十進位精度。其深層含義是什麼呢?

也就是說,在單精度浮點格式下,16,777,216和16,777,217表示為同一個數,不僅如此,處於兩個數之間的所有的數都表示為同一個數。由此可見,在程序中使用單精度格式表示浮點數也會出現問題,這時可以考慮使用雙精度浮點數。

雙精度格式

雙精度浮點數需要用8位元組表示,它的結構如下:

雙精度浮點數的指數偏移量為1023,或十六進位的3FFH,因此以該格式存儲的數可以表示為:

(-1)s×1.f×2e-1023

在單精度格式下,提到的單精度浮點格式下的0,無窮大(小)和NaN的判斷規則同樣適用於雙精度浮點格式。雙精度浮點數所能表示的範圍,用十進位可以近似記為:

10的308次冪是一個非常巨大的數,在1的後面跟著308個0。雙精度浮點格式的有效數為53位(IEEE754規定隱藏位1的位置在小數點之前),大致相當於十進位的16位。

關於浮點數的用法,與整數不同的是浮點數是有精度的,而初學者常在這些看起來似乎很不起眼的問題上陰溝裡翻船,其相應的范常式序詳見程序清單 1.4。

程序清單1.4 浮點數誤差測試范常式序(1)

1 #include

2 int main(int argc, char *argv[])

3 {

4 float fNum = 1000001.111111;

5

6 printf("fNum=%fn", fNum);

7 return 0;

8 }

程序清單 1.5 浮點數誤差測試范常式序(2)

1 #include

2 int main(int argc, char *argv[])

3 {

4 float f1 = 123.456001;

5 float f2 = 123.456002;

6

7 if(f1 == f2) {

8 printf("相等");

9 }else{

10 printf("不相等");

11 }

12 return 0;

13 }

對於浮點數來說,只要足夠接近0,就應該認為它的值為0,其合法的比較語句如下:

#define EPSINON 0.0001 // 定義程序可接受的浮點數0值

if(value - EPSINON) // value等於0

if(value >= EPSINON || value

>>>5. 類型轉換

數據類型是值的集合(內置類型或其它類型)和在這些值上的操作(函數)集,當執行一個操作時,必須確保操作數和結果具有正確的類型,忽視這一點是程序設計中的常見錯誤。

如果兩個表達式的類型相容,則編譯器對操作數隱式地進行自動轉換,隱式類型轉換是將範圍窄的的數類型轉換為範圍更寬的數的類型。也就是說,一些變數在編譯期與運行時的結果不一樣。即:

char、shortintunsigned intlongdouble (floatdouble)

計算的結果將以轉換後的類型表示,這樣可以保證結果儘可能準確。如果表達式的操作數分別為int型和double型,則int型的操作數被轉換為double型。比如:

int a = 4;

double b = 3.521, c;

c = a + b; // 編譯器將a自動轉換為double型,即4.0

a = a + b; // 編譯器將a+b的結果自動轉換為int

其結果為c = 7.521,a = 7(即截尾操作)。另有:

unsigned int a = 9;

int b = - 4, c;

c = a / b;

其中,a為unsigned int,b為int,編譯器會隱式地將int轉換為unsigned int。9對應的二進位數為0xFFFFFFF9,4對應的二進位數為0xFFFFFFF4,而-4的補碼形式為原碼4取反加1,即b為0xFFFFFFFC,則a/b為0。如程序清單 1.6所示的范常式序,這是招聘軟體工程師經常考察的經典試題。

程序清單 1.6變數的類型自動轉換范常式序

1 #include

2 int main(int argc, char *argv[])

3 {

4 unsigned char a = 0;

5 unsigned char b = 0xFF;

6

7 if (a == ~b){

8 printf("a == ~b");

9 }else{

10 printf("a != ~b");

11 }

12 }

(a)0,1 (b)與編譯器相關 (c)a != ~b (d)a == ~b

解題思路:大多數初學者會認為,0xFF取反後得到0x00,因為a和b在編譯期都是char類型變數,所以結果為a == ~b。而實際上在32位計算機中,表達式在運行時將unsigned char型的變數自動轉換成了unsigned int型變數,即~b = 0xFFFFFF00,顯然其結果a != ~b。

除了隱式類型轉換外,有時還需要強制類型轉換。比如,i是一個int值,那麼表達式「double i;」就會對i的值進行強制類型轉換,使該表達式變成double類型。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT技術java交流 的精彩文章:

使用Web前端技術實現的夢幻VR虛擬現實效果
高效Java程序員不能錯過的10+個最佳庫
兒童醫院要是都設計成這樣,孩子們還會抗拒嗎?
Web前端設計排版小技巧

TAG:IT技術java交流 |

您可能感興趣

什麼是環境變數?
美英「特殊關係」很一般,未來出現變數的可能性很大
時間變長 問題更難 變數增多 綠卡轉公民不再那麼容易
敘利亞關鍵一戰再生變數,俄敘退路被截斷,俄:不要輕舉妄動
一文教你如何計算變數之間的相關性
正確理解命運的定數與變數
正確理解命運的定數與變數!
婚姻變數那麼多,你的良緣在哪裡呢?
古典經濟學為什麼無法解釋中國高增長之謎?——欠缺的一個變數
世界盃後比特幣是漲是跌?這兩個變數很關鍵!
如何配置windows操作系統的環境變數?為什麼要配置環境變數
面板數據里處理多重高維固定效應的神器,還可用工具變數處理內生性
三星否認獲得三大關鍵材料緊急供應,變數又起
C 的變數
企鵝號:美英「特殊關係」很一般,未來出現變數的可能性很大
不要爭了,別的程序員是這麼給變數起名的!
情緒是可以調節的變數
美媒帶來甜瓜最新情況,難道還有變數?這次不敢說肯定,而說可能
俄與北約:新變數難解老問題
Go 語言變數作用域