為什麼不給C賦予初值,結果就狂亂了

時間 2023-03-24 00:10:06

1樓:匿名使用者

首先,當編譯器開始編譯你的程式時,遇到建立變數操作時,要去記憶體開闢空間來存放這個變數的資料,如果你在程式裡宣告變數的同時賦了初值,那麼編譯器就會把這個值儲存到記憶體裡,如果你沒有在宣告變數時賦初值,那麼編譯器會根據一定的規則儲存乙個值到這塊記憶體區域,要注意這個值不一定是0,簡言之編譯器不同,這個值就不同。

因此當你計算的時候,使用乙個沒有賦初值的變數就會發生意想不到的錯誤,因為這個變數的值是編譯器根據自己的規則賦予的。

明白否~~?

2樓:匿名使用者

直白地講:

記憶體位址是重複使用的,但是每個儲存單元每次使用完並不清零。所以下次定義某個變數被分配到這個儲存單元的時候,如果不賦初值,變數就會還是上次的值。

如果乙個變數需要多個儲存單元,那麼對應位址裡的值就會相當混亂。

換了個程式定義了個int變數,佔4個位元組空間。正好分配到剛剛那裡。

如果不賦初值,那麼它的值就是hex(44434241)也就是1145258561.那還不就"狂亂"了?

3樓:匿名使用者

gbwzxalec_1111

兩位說的很明白了。

不是為什麼一定要賦初值,沒說一定要。

像這個程式裡面。b,和ever並不用賦,因為在接下的程式裡都有直接賦值的語句。

而c卻要賦個初值,實際這裡的意義是清零。因為c不是直接賦值而是c=c+b.

我們想要的是c本來是0.但你定義c時,開闢記憶體空間。這個空間可能是之前有程式用過的,裡面有數值沒清零的。這就造成c是帶著乙個不確定的數值在運算。

結果顯然也不確定。

賦初值與否就看你這個變數在下面用的過程中會不會出現這種不確定性。

4樓:斜塘拂柳

記憶體分為。**區。

全域性資料區。

堆區。棧區。

恩,在主函式外宣告的變數,或者靜態變數(static關鍵字宣告)存於全域性區,這個區的自動初始化為零,一般區域性變數,比如程式中的c,宣告時只是分配空間,空間中的值沒有刪去,還是原來的值。c的空間值是前面遺留下來的。這常常是不可知的。

所以區域性變數必須初始化。呵呵,高手如果知道原來的值,不初始化也可以。那人肯定是超人。

恩,簡略說一下。

5樓:大白兔

沒初值,程式怎麼可以為他計算啊。

比如你定義乙個整型變數a,然後就直接輸出printf("%d",a);

肯定會錯的了,你都沒給a值,讓他輸出什麼,肯定是亂碼啊。會出錯的。

比如,什麼時候有的值需要賦予初值。

這個我就幫不了你了啊,具體情況要具體解決,題做多了自然會明白,大家也都是這麼琢磨出來的。

祝lz成功!

6樓:匿名使用者

c+=b;

因為這裡。c+=b; 等價c=c+b;你的c是乙個沒有賦值的變數,但是卻參與了運算。

明白? 如果是c=b+b;這樣c不參與運算的話就可以不用賦初值。

但如果你定義的變數將來要參與運算,則一定要賦初值。

7樓:日思名司

所有值最好都賦上初值,不然後來調錯會很痛苦。

8樓:匿名使用者

沒給c付值,c的值是隨機的。

c語言靜態變數定義時賦初值和不賦初值

9樓:

239: m=n+++n---n;

00401047 mov eax,dword ptr [ebp-4](1)

0040104a mov dword ptr [ebp-8],eax(2)

0040104d mov ecx,dword ptr [ebp-4](3)

00401050 sub ecx,1 (4)

00401053 mov dword ptr [ebp-4],ecx (5)

00401056 mov edx,dword ptr [ebp-4] (6)

00401059 add edx,1 (7)

0040105c mov dword ptr [ebp-4],edx (8)

從上面可以看出來(1)(2)是計算m=n+n-n的,(4)(5)(6)是計算n--的,(6)(7)(8)是計算n++的,這也符合++、是從右到左的運算規則。

m=(n++)n--)n;

0040102f mov eax,dword ptr [ebp-4]

00401032 mov dword ptr [ebp-8],eax

00401035 mov ecx,dword ptr [ebp-4]

00401038 sub ecx,1

0040103b mov dword ptr [ebp-4],ecx

0040103e mov edx,dword ptr [ebp-4]

00401041 add edx,1

00401044 mov dword ptr [ebp-4],edx

兩者對比下就知道了,加了兩個括號是等價的。

10樓:匿名使用者

#include

main()

printf(""

for(int k=0;k<3;k++)該句出錯,已定義過乙個k的變數,應改為for(k=0;k<3;k++)k從定義開始在整個main函式中有效)

兩者相當;n=1;n+++n---n=(n++)n--)n=1+1-1;

因為n++,n--是在該句(定義int k; k=n+++n---n;)執行後執行,n的值才改變。

11樓:匿名使用者

static 是初始化~注意初始化和賦值是不一樣的~~

賦值語句重複執行多次`在乙個程式中,而變數只初始化一次。

而static靜態變數作用域是可以覆蓋到每個塊的。(可以把每次的迴圈體看做乙個小塊)

//static int x;是不是就相當於static int x=0;

//還有一問題:n=1;n+++n---n為什麼是1?這不是與(n++)n--)n一樣嗎?

這個慮一遍過程。讀到第乙個運算元n,繼續讀右面操作符,最先組成操作符的為乙個操作符~~那麼乙個'+'就是乙個操作符,後面的++是前自增。後面的以此類推。

不過這種問題不必過於糾纏。現實中**寫成這樣的人,不是腦障礙就是腦殘疾。

12樓:匿名使用者

static定義的全域性變數在沒有賦值時預設是0 正確。

下面乙個問題建議你查:算術符號優先順序。

c 語言中為什麼不賦初值出來的值是隨機的

13樓:匿名使用者

因為宣告變數時,編譯系統只是給你分配了乙個變數的儲存空間,誰也不知道你執行程式前有什麼軟體使用過這個空間,所以它的值是隨機的。

14樓:匿名使用者

跟分配記憶體空間有關係。

15樓:匿名使用者

並不是所有未初始化的變數都是隨機值。比如,未初始化的全域性變數和用static修飾的區域性變數的值都是0;只有在stack和heap未初始化的變數才是隨機值。

c為什麼要給類的物件賦初值呢?不賦初值為什麼就不能使用呢?

16樓:橫空世

問題不是這麼說的吧,類的物件的宣告就會相應的給其開闢空間,同時呼叫建構函式,這個賦初值,就是在這時候進行的,因為開闢空間,就是賦初值,只有如此才能使用,這樣說的話,就對了。

17樓:

類的物件和普通的內建型別資料乙個道理,如下程式:

void main()

這兩句程式定義乙個區域性變數且未賦初值,則b求出的結果沒意義。

18樓:匿名使用者

怎麼說呢,你這句話說的不對。。。不一定是賦初值,可以是別的操作呀。。

19樓:

你是在哪看到這幾話的,這樣說不對,看書不要斷章取義。

20樓:匿名使用者

不需要啊,你什麼意思?

c陣列賦初值問題

21樓:井鈺

c\c++,就是這樣的如果你不清空陣列,他在新開的陣列中會是隨機值,沒有「預設值」這個說法,因此也就沒有預設為0這個說法。

你可以相信static的變數和全域性變數會自動初始化為0,但你不應該依賴它;於是,更不應該依賴區域性資料的自動初始化了。

所以,寫程式的時候不要有這種依賴,寫程式要記得在使用之前進行初始化。

22樓:

int roll[7]=.

這裡是給陣列所有元素賦值為0.

哪本書說陣列不賦初值的話,都是為0,那本書扔了吧。

23樓:網友

不為零 就是空 roll[m]++就沒有意義了。

24樓:匿名使用者

不是不賦初值所有元素就為零,如果你只初始化一部分元素的話,其它的元素就預設為零,如果你不給陣列任何元素初始化的話,陣列中所有元素分配的就是隨機的數。

25樓:網友

是初始值,如果你不復初始值,那你就從鍵盤輸入值,而roll[7]=;後,說有的元素為0;如果照書上所說,所有的元素為0,但並不能用吧?我想:陣列預設為0,但需要從鍵盤輸入值。

為什麼這個c可以賦兩個初值?

26樓:匿名使用者

是不是寫錯了啊。

你刪除乙個 看看執行結果有沒有影響就知道了。

c語言中定義變數不賦初值預設是多少?

27樓:enjoy蘰踄繧鍴

沒有加static,預設為auto 型,此時,不給初值,變數的初值是隨機的。

如果加了static不給初值,變數的初值是預設的 0。

其實不能說不賦初值就不行,對於區域性變數,不賦初值的話,其實他裡面存的是乙個隨機的值,誰也不知道他是多少,因此如果沒賦初值的情況下就使用它,程式是完全不可控的,如你的圖1,直接在while裡去判斷b了,因此這個while判斷是不可控的。

【c語言】c語言是一門通用計算機程式語言,應用廣泛。c語言的設計目標是提供一種能以簡易的方式編譯、處理低階儲存器、產生少量的機器碼以及不需要任何執行環境支援便能執行的程式語言。

儘管c語言提供了許多低階處理的功能,但仍然保持著良好跨平台的特性,以乙個標準規格寫出的c語言程式可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(微控制器或稱mcu)以及超級電腦等作業平台。

二十世紀八十年代,為了避免各開發廠商用的c語言語法產生差異,由美國國家標準局為c語言訂定了一套完整的國際標準語法,稱為ansi c,作為c語言最初的標準。

28樓:聶友鐸暖暖

由編譯器決定的!!很不安全這種!!有的編譯器預設值為0

或者null,有的是乙個非常大的負值,或者是最小的乙個數!一般都會定義的時候初始化下!!

29樓:匿名使用者

這個得看是什麼變數,還要看在**定義。

在全域性範圍定義的變數會有預設初值,int 為 0,浮點為 ,字串為空串。

在區域性範圍(函式中)定義的變數,如果沒有賦初值,那麼變數的值是不確定的。

30樓:雨林

如果是整形值的化是0,如果是指標的化它的內容則是隨機的,指標定義是最好初始化為null

31樓:匿名使用者

看你定義的變數的作用域,若為全域性變數一般系統初始化為0;

若為區域性變數,系統會給乙個隨機值,建議初始化。

32樓:網友

不一定啊,還要看不同的編譯器,很多時候是0,所以你最好給需要初值的變數賦好你想要的初值了。

33樓:鍋勁

一般情況 沒有加static 預設為auto 型此時 不給初值,變數的 初值是隨機的。

但是 如果加了 static 不給初值 變數的初值是預設的 0

指標也是一樣,其實 null 的值 就是 0只是它不代表任何位址謝謝。

為什麼不給糖就搗亂,夢幻西遊不給糖就搗亂答案大全

給i畫餅充飢 起源說法一 中世紀時期,萬聖節有一個流行的活動 製作 靈魂之餅 靈魂之餅 實際上就是一種上面覆有葡萄乾的麵包甜點。按照所謂的 慰靈 風俗,孩子們要挨家挨戶討要這種餅,這與現代的 不給糖果就搗蛋 活動非常相似。孩子們每得到一塊這種餅,就要為送餅人的已故親友祈禱一次。這些祈禱會幫助他們的親...

c語言計算為什麼結果不對,c語言計算結果不對 哪裡有問題?

在double轉換成int時,應當考慮到數值並不準確的問題,可以考慮自己要求的精度極限,比如是0.00000001,可以寫成 printf d n int a pow 10,b 1 0.000000005 這樣可以配合取整實現在那位上的四捨五入。 gta小雞 計算整數的冪,不要使用pow函式,它返回...

為什麼我執行C語言後,顯示不到結果

最後一個花括號前加上 system pause c語言程式可以執行,但不顯示結果 while m 1 這個是不是有問題,如果是判斷m等於1,應該是m 1 這個是賦值語句。無縮排 無註釋 無空格 不答不解釋 也要先說說你的程式是想要完成什麼功能,這樣看起來比較方便啊 給點註解之類的吧 實在不懂什麼意思...