看板 C_and_CPP 關於我們 聯絡資訊
最近在翻之前被 m 的文章,發現一些有趣的東西。 ※ 引述《runtime (LLLLL)》之銘言: : 1. void *i = 3; int j = 7; printf("%d\n",i+j); 請問結果為何者? 有三個地方都很麻煩:(1) 數字轉指標 (2) 指標運算 (3) %d 印指標 這題整個加起來就是未定義。 : 4. 如果老師今天要你使要迴圈來寫一支聖誕樹程式 請問最少需要使用幾個迴圈? 可以不管老師嗎?xD : 7. i=7;j=44;i^=j^=i^=j; 請問執行以上程式後 i 為多少? j 為多少? (已修正) 未定義。 : 8. 任何程式語言的第一支程式通常叫什麼 感覺知道這個跟 C 語言的程度沒有什麼關係... === 回應一些我有興趣的推文 xD : 推 smallworld:第七題是很有名的神碼啊 08/13 01:32 未定義。 : → softwind:第一題?void*+int compiler應該會報 他不知道要跳幾個By 08/13 01:32 : 咦 Dev C 跑得出來是 10 既然未定義,編譯器愛印什麼都對啊 xD : 推 Fenikso:c99新增的compound literal 08/13 06:09 : 推 Fenikso:http://www.ddj.com/cpp/184401404 08/13 07:20 : → Fenikso:那不是宣告也不是type cast 08/13 07:20 正解! : 推 Bencrie:第一題感覺還好 ... pointer本來就跟long一樣 XD 08/13 12:25 其實一點關係也沒有... : 推 QQ29:不過void*我無法對他作++ --耶 是因為void 沒有規定是幾byte? 08/13 14:55 (掉書袋模式)因為 void 永遠都是不完整的型態(incomplete type) : 推 Bencrie:試了一下 ... 用int*他回我 31耶 @@a why? 08/13 15:29 : 推 Bencrie:加了轉型(int)i+j 才會對 orz 08/13 15:32 看實作。強烈建議不要這樣玩... : 推 Bencrie:oops 大概有點頭緒了,因為左邊的型態是pointer 08/13 15:38 : → Bencrie:右邊的型態是int,這樣有點像 *(i+j) 然後不要做deref 08/13 15:39 : → Bencrie:只是單純的計算陣列地址 XD 08/13 15:39 在 C99 中沒有任何保證。 : 推 VictorTom:void *i=3; // 翻譯, 讓指標i指到記憶體位置0x00000003 08/13 16:11 : → VictorTom:基本上就根void *i = NULL; 做得事情差不多.... 08/13 16:12 : → VictorTom:i=NULL時你print變數i, 它就把i目前的值(即指到的位置) 08/13 16:12 : → VictorTom:印出來給你看, 所以print出來是3; 就好像指到NULL時印 08/13 16:13 : → VictorTom:出來是0一樣; 記憶體位址不過用一個數字代表/記錄而已:) 08/13 16:14 : 推 su31o4gj83:原來如此, 謝謝V大的回覆 08/13 16:17 這種數字轉指標都是看實作怎麼定。標準對 NULL 有特別規定所以 才比較安全一點。 : → operationcow:第七題不能套用新手十戒的第九戒嗎@@ 08/15 11:16 如果是這個的話沒錯呀: | 8. 在一個運算式中,不能對一個基本型態的變數修改其值超過一 | 次以上 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.39
firejox:我應該要說 編譯器是踩在UB的情況下誕生的東西嗎XD 07/22 21:38
firejox:容許些微UB可能會讓自己比較好過一點... 07/22 21:44
通常都可以避免啦。這幾題根本就是故意搞怪的吧!不過編譯器一 直(合法地)亂搞也是很討厭...
firejox:void 的本意就是 虛空呀~~ 07/22 21:47
我覺得與其說虛空,比較像是 unit 型態。虛空代表不允許任何值,unit 型態洽允許一個值。這已經是純數學的型態理論了,有興趣的可以看這裡: http://en.wikipedia.org/wiki/Unit_type
firejox:我覺得套用到第8點有點怪怪的... 07/22 21:59
kiedveian:第七題是3個運算式吧… 07/22 22:58
suhorng:@kiedveian: i^=j^=i^=j; 有問題 (修改多次)的樣子 07/22 23:16
對我是這個意思沒錯。至少 i 被改兩次(不管其他未定義的部份)
tropical72:聖誕樹 長怎樣? 07/22 23:17
littleshan:puts("聖誕樹"); 不需要迴圈 07/22 23:48
xatier:樓上正解 07/23 00:11
哈哈果然是正解 xDDD
Ross0916:是掉書袋 最近常覺得F大若唸法也是一流的XD 07/23 04:26
感謝指正!唉人生太短了,光電腦科學裡面的一個小領域就讀不完了... ※ 編輯: Favonia 來自: 140.112.30.39 (07/23 07:33)
softwind:既然我在文章裡 那我要補充一下第一題 結果應該是 07/23 14:29
softwind:1. build不過 or 2. GCC有可能把 void* 當成char* offset 07/23 14:29
如果限定 GCC 我目前查到的說明文件有這些: (1) GCC 把 void 大小當作 1:(其實原文章就有人指出) http://gcc.gnu.org/onlinedocs/gcc/Pointer-Arith.html (2) 數字和指標的轉換就跟大家想的差不多: http://gcc.gnu.org/onlinedocs/gcc/Arrays-and-pointers-implementation.html 但是還有最後一個問題!我有一台電腦 %d (int) 洽是 32 位元,但是指 標有 64 位元(LP64 架構)。我懶得查 printf 內部到底怎麼實作的,不知道 會不會出問題。總之第一題有很多危險的地方都要看實作怎麼做。
softwind:8. http://zh.wikipedia.org/wiki/HelloWorld 07/23 14:31
唉姑且不論我覺得這題跟 C 語言的程度毫無關係外。我想引用英文版維基 其中一段: | There are variations in spirit, as well. Functional programming | languages, like Lisp, ML and Haskell, tend to substitute a fac- | torial program for Hello World, as the former emphasizes recursive | techniques, which are a large part of functional programming, | while the latter emphasizes I/O, which violates the spirit of | pure functional programming by producing side effects. @ http://en.wikipedia.org/wiki/HelloWorld 我三種語言(流派)都有學過,所以對於「『所有』程式語言」的「所有」 有點感冒 xDDD 總覺得不太尊重其他語言。 ※ 編輯: Favonia 來自: 140.112.30.39 (07/23 19:23)
Bencrie:一年前的推文被挖出來鞭真讓人傷心 orz 07/24 01:08
loveme00835:學長拍拍 07/24 01:14
對不起 orz 我只是想要點出以前被 m 的文章可能誤導人的地方而已。
firejox:第1題除了void* 個人認為其他不太會有問題... 07/24 01:49
firejox:64與32 間差的只是cast而已.... 07/24 02:10
因為 printf 後面有不定數量的參數,所以實務上編譯器沒有辦法做太多轉 型。這跟寫死 32 位元的參數不一樣;因為如果寫死的話,編譯器事前可以知道 要把參量轉型成 32 位元。實務上如果 64 位元的參量要拆成兩部份傳,就可能 發生災難(一個參量被當成兩個參量)。我現在在用的電腦是 AMD64, 它的 ABI 規定每個參數都是用 64 位元來對齊,然後暫存器也是 64 位元,所以在這例子 中沒辦法提供驚人的結果 xD (我知道 gcc 一般會按照平台預設的 ABI, 然後我也知道我自己用的 ABI 長什麼樣子。只是這些 C 標準什麼都沒講,也許有人用奇怪的 ABI 也說不定。)
softwind:嗯~ sorry 我不清楚原po的工作類型 不過如果是 電腦/手機 07/24 01:50
softwind:or 代工廠 基本上語言會比較侷限在 C/C++/Java 這3種 07/24 01:51
你當我在發牢騷就好 xD 我個人覺得第一個程式叫什麼不太重要啦 xD 還是 要謝謝你的回應。然後我平常就會學各種怪東西,跟工作沒什麼關係 xD ※ 編輯: Favonia 來自: 140.112.30.39 (07/24 10:06) ※ 編輯: Favonia 來自: 140.112.30.39 (07/24 10:15)