Re: [閒聊] facebook上的C語言測驗

看板C_and_CPP (C/C++)作者 (小西風最乖了*^^*)時間13年前 (2011/07/22 19:26), 編輯推噓5(5014)
留言19則, 10人參與, 最新討論串3/3 (看更多)
最近在翻之前被 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

07/22 21:38, , 1F
我應該要說 編譯器是踩在UB的情況下誕生的東西嗎XD
07/22 21:38, 1F

07/22 21:44, , 2F
容許些微UB可能會讓自己比較好過一點...
07/22 21:44, 2F
通常都可以避免啦。這幾題根本就是故意搞怪的吧!不過編譯器一 直(合法地)亂搞也是很討厭...

07/22 21:47, , 3F
void 的本意就是 虛空呀~~
07/22 21:47, 3F
我覺得與其說虛空,比較像是 unit 型態。虛空代表不允許任何值,unit 型態洽允許一個值。這已經是純數學的型態理論了,有興趣的可以看這裡: http://en.wikipedia.org/wiki/Unit_type

07/22 21:59, , 4F
我覺得套用到第8點有點怪怪的...
07/22 21:59, 4F

07/22 22:58, , 5F
第七題是3個運算式吧…
07/22 22:58, 5F

07/22 23:16, , 6F
@kiedveian: i^=j^=i^=j; 有問題 (修改多次)的樣子
07/22 23:16, 6F
對我是這個意思沒錯。至少 i 被改兩次(不管其他未定義的部份)

07/22 23:17, , 7F
聖誕樹 長怎樣?
07/22 23:17, 7F

07/22 23:48, , 8F
puts("聖誕樹"); 不需要迴圈
07/22 23:48, 8F

07/23 00:11, , 9F
樓上正解
07/23 00:11, 9F
哈哈果然是正解 xDDD

07/23 04:26, , 10F
是掉書袋 最近常覺得F大若唸法也是一流的XD
07/23 04:26, 10F
感謝指正!唉人生太短了,光電腦科學裡面的一個小領域就讀不完了... ※ 編輯: Favonia 來自: 140.112.30.39 (07/23 07:33)

07/23 14:29, , 11F
既然我在文章裡 那我要補充一下第一題 結果應該是
07/23 14:29, 11F

07/23 14:29, , 12F
1. build不過 or 2. GCC有可能把 void* 當成char* offset
07/23 14:29, 12F
如果限定 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 內部到底怎麼實作的,不知道 會不會出問題。總之第一題有很多危險的地方都要看實作怎麼做。

07/23 14:31, , 13F
唉姑且不論我覺得這題跟 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)

07/24 01:08, , 14F
一年前的推文被挖出來鞭真讓人傷心 orz
07/24 01:08, 14F

07/24 01:14, , 15F
學長拍拍
07/24 01:14, 15F
對不起 orz 我只是想要點出以前被 m 的文章可能誤導人的地方而已。

07/24 01:49, , 16F
第1題除了void* 個人認為其他不太會有問題...
07/24 01:49, 16F

07/24 02:10, , 17F
64與32 間差的只是cast而已....
07/24 02:10, 17F
因為 printf 後面有不定數量的參數,所以實務上編譯器沒有辦法做太多轉 型。這跟寫死 32 位元的參數不一樣;因為如果寫死的話,編譯器事前可以知道 要把參量轉型成 32 位元。實務上如果 64 位元的參量要拆成兩部份傳,就可能 發生災難(一個參量被當成兩個參量)。我現在在用的電腦是 AMD64, 它的 ABI 規定每個參數都是用 64 位元來對齊,然後暫存器也是 64 位元,所以在這例子 中沒辦法提供驚人的結果 xD (我知道 gcc 一般會按照平台預設的 ABI, 然後我也知道我自己用的 ABI 長什麼樣子。只是這些 C 標準什麼都沒講,也許有人用奇怪的 ABI 也說不定。)

07/24 01:50, , 18F
嗯~ sorry 我不清楚原po的工作類型 不過如果是 電腦/手機
07/24 01:50, 18F

07/24 01:51, , 19F
or 代工廠 基本上語言會比較侷限在 C/C++/Java 這3種
07/24 01:51, 19F
你當我在發牢騷就好 xD 我個人覺得第一個程式叫什麼不太重要啦 xD 還是 要謝謝你的回應。然後我平常就會學各種怪東西,跟工作沒什麼關係 xD ※ 編輯: Favonia 來自: 140.112.30.39 (07/24 10:06) ※ 編輯: Favonia 來自: 140.112.30.39 (07/24 10:15)
文章代碼(AID): #1EALvEfJ (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EALvEfJ (C_and_CPP)