Re: [問題] 迴圈裡面宣告的變數

看板C_and_CPP作者 (小西風最乖了*^^*)時間13年前 (2011/06/27 01:28), 編輯推噓11(11027)
留言38則, 10人參與, 最新討論串4/4 (看更多)
※ 引述《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
因為這有時會明講 behavior is undefined, 但是上面寫
06/27 02:02, 3F

06/27 02:03, , 4F
的你沒做到, 也是等於這件事情
06/27 02:03, 4F

06/27 02:46, , 5F
唔,看不太懂3、4F那句的意思@_@a。
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
懂了@_@a,感謝<(_ _)>,所以這根本是有定義的喔 @_@a
06/27 04:25, 8F

06/27 04:28, , 9F
我覺得標準根本沒講清楚。標準的重點在於編譯器要發警告!
06/27 04:28, 9F

06/27 05:34, , 10F
看了一下其他的constraint,好嚴重啊,一違反幾乎就CE了
06/27 05:34, 10F

06/27 09:52, , 11F
c/c++真的是很煩程式語言.尤其是c有好嚴重的歷史包袱
06/27 09:52, 11F

06/27 11:22, , 12F
樓上讓我想到一件很有趣的事情,很多C的信徒覺得C++很dirty
06/27 11:22, 12F

06/27 11:23, , 13F
卻無視這些dirty幾乎都是從C繼承來的這個事實 XD
06/27 11:23, 13F

06/27 11:23, , 14F
很好奇如果C++完全不理會C的相容性,會是怎樣的語言 XD
06/27 11:23, 14F

06/27 11:23, , 15F
可惜實際上不可能這麼做...
06/27 11:23, 15F

06/27 11:29, , 16F
一定是很完美的語言,竟然可以忍受c的黑暗包袱
06/27 11:29, 16F

06/27 12:52, , 17F
回樓樓上 請見 http://www.digitalmars.com/d/
06/27 12:52, 17F

06/27 12:55, , 18F
D語言算是不理C的C++? 之前沒有深入研究過...XD
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
缺點,加進了一些C++沒有的優點,不過後來C++0x越來越讓人期
06/27 15:26, 21F

06/27 15:27, , 22F
待,且golang的型別系統也讓人很喜歡,然後就不鳥d了 QQ
06/27 15:27, 22F

06/27 15:45, , 23F
XD
06/27 15:45, 23F

06/27 16:48, , 24F
我倒是看過 D 2.0 後就對 C++0x 不抱期望了
06/27 16:48, 24F

06/27 17:49, , 25F
~"~ 我的錯覺嘛? 我記得wiki沒有很稱讚D阿
06/27 17:49, 25F

06/27 17:52, , 26F
嫌貨才是買貨人,沒人用的東西就不會有人嫌
06/27 17:52, 26F

06/27 17:57, , 27F
是喔,那我也來看一下2.0,竟然前輩這麼推
06/27 17:57, 27F

06/27 18:16, , 28F
真的是很優秀的語言, 真替她難過 QQ
06/27 18:16, 28F

06/27 18:33, , 29F
C++: Q口Q
06/27 18:33, 29F

06/27 18:38, , 30F
C++: Q口Q
06/27 18:38, 30F

06/27 20:47, , 31F
誰叫c++還不肯離開c.c++98版本後,早就可以自立門戶
06/27 20:47, 31F

06/27 20:48, , 32F
要不是跨平台的問題.
06/27 20:48, 32F

06/27 22:18, , 33F
C++要是離開C就不會有人用了,因為舊的code無法編
06/27 22:18, 33F

06/28 09:15, , 34F
小善是對的
06/28 09:15, 34F

06/29 00:08, , 35F
C++離開C後 C++使用者會很開心的
06/29 00:08, 35F

06/29 00:11, , 36F
不過真正的C++使用者應該不太多....XD
06/29 00:11, 36F

06/29 16:19, , 37F
james是對的
06/29 16:19, 37F

06/29 17:24, , 38F
可能要先定義真正的意思
06/29 17:24, 38F
文章代碼(AID): #1E1snMFF (C_and_CPP)
文章代碼(AID): #1E1snMFF (C_and_CPP)