Re: [問題] 迴圈裡面宣告的變數
※ 引述《loveme00835 (朴髮箍)》之銘言:
: 或是如粉紅色字體所寫, 中括號裡的敘述值只能擺正整數:
: int array[ 0 ];
: 以上這行, 用 gcc 編譯加上選項 -pedantic 就會顯示警告:
: [Warning] ISO C forbids zero-size array 'array'
: 這樣做會導致未定義行為! 程式會怎麼掛沒人保證; 而不是會怎麼
: 跑沒人保證...
先說明清楚,沒事大家的確不要這樣寫比較好。這裡會很龜毛的討論標準的
技術細節,沒興趣的請按左鍵離開 xD 懶得看標準的只需記得「不要這樣寫!」
標準沒有很清楚的說明 int array[0]; 是未定義。我猜誤以為標準有非常清
楚說明的的人是因為讀到這句:
C99+TC1/2/3 n1256 4/1
If a "shall" or "shall not" requirement that appears outside of a
constraint is violated, the behavior is undefined. ...
注意有個但書「outside of a constraint」
C99+TC1/2/3 n1256 6.7.5.2/1
注意這是一條 constraint!!!
... If the expression is a constant expression, it shall have a value
greater than zero. ...
所以其實標準沒有很清楚說這是「未定義」。反而標準要求編譯器要有錯誤
訊息才行。程式違反 constraint 的話編譯器是有責任提醒的:
C99+TC1/2/3 n1256 5.1.1.3/1
A conforming implementation shall produce at least one diagnostic
message (identified in an implementation-defined manner) if a pre-
processing translation unit or translation unit contains a violation
of any syntax rule or constraint, even if the behavior is also
explicitly specified as undefined or implementation-defined.
所以要求程式設計師小心的同時,也應注意編譯器有沒有發出錯誤訊息。個
人覺得程式設計師已經夠辛苦了,這種雜事當然丟給編譯器做就好。既然標準有
說要有錯誤訊息,我覺得一點也不需要怪程式設計師,反而要怪為什麼得用這麼
迂迴的方法才印得出錯誤訊息。(如 gcc 4.5.2 連加上-std=c99 -Wall
都不會顯示,得要用如 loveme00835 大大提的 -pedantic)
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.30.39
→
06/27 01:58, , 1F
06/27 01:58, 1F
→
06/27 01:59, , 2F
06/27 01:59, 2F
→
06/27 02:02, , 3F
06/27 02:02, 3F
→
06/27 02:03, , 4F
06/27 02:03, 4F
推
06/27 02:46, , 5F
06/27 02:46, 5F
→
06/27 02:48, , 6F
06/27 02:48, 6F
→
06/27 02:49, , 7F
06/27 02:49, 7F
er... 總之
(1) 標準沒有清楚說未定義
(2) 編譯器要負責提醒這種錯誤
===
感謝 a127 提醒!C 標準對於 constraint 有嚴格定義,跟一般人的用法
不一樣。要怎麼知道是 constraint 呢?以 C99+TC1/2/3 (n1256) p.128 為例:
6.7.5.2 Array declarators
Constraints
1 In addition to ...
2 An ordinary identifier ...
Semantics
3 ...
4 ...
所以前兩個段落就是 constraints! 裡面出現的 shall 不受到 4/1 的規範。
而其他地方出現的 shall/shall not 只要一違反就是未定義,希望有成功清楚
解釋。先說我討厭標準寫得這麼麻煩,不過它的確是這個意思。
※ 編輯: Favonia 來自: 140.112.30.39 (06/27 04:24)
推
06/27 04:25, , 8F
06/27 04:25, 8F
→
06/27 04:28, , 9F
06/27 04:28, 9F
推
06/27 05:34, , 10F
06/27 05:34, 10F
→
06/27 09:52, , 11F
06/27 09:52, 11F
→
06/27 11:22, , 12F
06/27 11:22, 12F
→
06/27 11:23, , 13F
06/27 11:23, 13F
→
06/27 11:23, , 14F
06/27 11:23, 14F
→
06/27 11:23, , 15F
06/27 11:23, 15F
→
06/27 11:29, , 16F
06/27 11:29, 16F
推
06/27 12:52, , 17F
06/27 12:52, 17F
→
06/27 12:55, , 18F
06/27 12:55, 18F
※ 編輯: Favonia 來自: 140.112.30.39 (06/27 12:58)
→
06/27 14:00, , 19F
06/27 14:00, 19F
→
06/27 15:25, , 20F
06/27 15:25, 20F
→
06/27 15:26, , 21F
06/27 15:26, 21F
→
06/27 15:27, , 22F
06/27 15:27, 22F
推
06/27 15:45, , 23F
06/27 15:45, 23F
推
06/27 16:48, , 24F
06/27 16:48, 24F
→
06/27 17:49, , 25F
06/27 17:49, 25F
推
06/27 17:52, , 26F
06/27 17:52, 26F
→
06/27 17:57, , 27F
06/27 17:57, 27F
→
06/27 18:16, , 28F
06/27 18:16, 28F
推
06/27 18:33, , 29F
06/27 18:33, 29F
推
06/27 18:38, , 30F
06/27 18:38, 30F
→
06/27 20:47, , 31F
06/27 20:47, 31F
→
06/27 20:48, , 32F
06/27 20:48, 32F
推
06/27 22:18, , 33F
06/27 22:18, 33F
→
06/28 09:15, , 34F
06/28 09:15, 34F
推
06/29 00:08, , 35F
06/29 00:08, 35F
→
06/29 00:11, , 36F
06/29 00:11, 36F
→
06/29 16:19, , 37F
06/29 16:19, 37F
→
06/29 17:24, , 38F
06/29 17:24, 38F
討論串 (同標題文章)