2011-12-22 90 views
-1

雖然我讀一些C教程,我發現這條線,我不明白:c中的範圍檢查是什麼?

C不範圍檢查

這是什麼意思?

另一個小問題:如何在完成後暫停代碼不要很快終止?我想我們說System("PAUSE")或類似的東西。我怎樣才能在C?

+7

每個問題請提出一個問題。 C教程很愚蠢;得到一本書。作者可能在談論如何在訪問時未驗證數組邊界。爲什麼這個標記爲C++?不要在程序中實現暫停;如果它在執行後消失,則是環境的錯誤,因此修復環境。 – 2011-12-22 12:05:12

+5

@ TomalakGeret'kal請對每條評論發表一條評論;) – MByD 2011-12-22 12:07:10

+0

@BinyaminSharet:;) – 2011-12-22 12:07:30

回答

1

這意味着您可以定義邏輯結果超出該類型允許的值範圍之外的操作。例如

unsigned char a = 0xFF; 
unsigned char b = a + 1; 

編譯器會非常高興地允許這個,並返回0x00的結果。 0xFF + 1溢出一個字節存儲的a。請注意,0x00只是正確答案'0x100'的低8位。

unsigned char a = 0xFF; 
unsigned b = (unsigned)a + 1; 

,其通過將其轉換爲更大的整數類型,並保存到一個較大型的第一使得用於在該值更大的空間:這可以通過進行修補。

類似的問題是邊界檢查在編譯器會很樂意讓你寫:

int a[5] = {1, 2, 3, 4, 5}; 
i = 1000; 
b = a[i]; 

(編輯基於評論:) 這段代碼執行後,異常可能會被拋出,但編譯器根本不在乎。

+1

或者只是'unsigned b = a + 1',因爲當值'0x100'被存儲到'b'時,第一個例子中的繞回發生(假設'CHAR_BIT == 8'),而不是當'1'被添加到'0xFF'時。 – 2011-12-22 12:22:16

+0

@SteveJessop好點。 – 2011-12-22 12:23:23

+0

正如WTP在您刪除的答案中所說的那樣,'b'不保證在數組末尾有995個字的任意值。代碼的行爲是未定義的。它可能會崩潰,着火,爲堆棧溢出等引發硬件異常,而不是將「b」設置爲任何值。 – 2011-12-22 12:25:49

0

在Windows上,如果您有#included stdlib.h,您可以經常說系統(「暫停」)使環境等待您按回車。但是,您應該注意以下事項:

  • 它不被認爲是近好的做法任何地方依靠pause.exe命令在當前環境中存在。在大多數Windows系統上可能都是如此,但在Unices或Mac上通常不適用。所以你會限制你的便攜式程序到一個單一的平臺。

  • 您可能想要考慮爲什麼您希望用戶按Enter鍵。大多數人認爲,如果程序開始工作,然後退出,這很好。 「真實」的程序以這種方式等待用戶確認是非常罕見的。如果你只是想看看DOS提示符在它自己關閉之前說了些什麼,也許問題出在DOS提示符而不是你的程序上?

我記得在開始編程時詢問同樣的問題,但後來我意識到在大多數情況下暫停程序是錯誤的。

+0

我一直在想爲什麼人們使用'system(「pause」);'? 'getchar()'有問題嗎?非便攜性是可取的還是什麼? – Dave 2011-12-22 16:38:09

+0

@Dave輸入緩衝區中可能存在文本,在這種情況下,getchar()不執行任何操作。我記得在C++中,獲取輸入的cin >>方法會在緩衝區中留下換行符,從而導致該技術失敗。 – jforberg 2011-12-22 16:53:05

+0

然後'while(getchar()!= EOF);'應該這樣做。這主要是因爲IDE可以看到他們程序的輸出,而按下'ctrl-d'並不難。 – Dave 2011-12-22 17:42:20