Re: [閒聊] facebook上的C語言測驗
看板C_and_CPP (C/C++)作者Favonia (小西風最乖了*^^*)時間13年前 (2011/07/22 19:26)推噓5(5推 0噓 14→)留言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
07/22 21:38, 1F
→
07/22 21:44, , 2F
07/22 21:44, 2F
通常都可以避免啦。這幾題根本就是故意搞怪的吧!不過編譯器一
直(合法地)亂搞也是很討厭...
→
07/22 21:47, , 3F
07/22 21:47, 3F
我覺得與其說虛空,比較像是 unit 型態。虛空代表不允許任何值,unit
型態洽允許一個值。這已經是純數學的型態理論了,有興趣的可以看這裡:
http://en.wikipedia.org/wiki/Unit_type
→
07/22 21:59, , 4F
07/22 21:59, 4F
→
07/22 22:58, , 5F
07/22 22:58, 5F
→
07/22 23:16, , 6F
07/22 23:16, 6F
對我是這個意思沒錯。至少 i 被改兩次(不管其他未定義的部份)
→
07/22 23:17, , 7F
07/22 23:17, 7F
推
07/22 23:48, , 8F
07/22 23:48, 8F
→
07/23 00:11, , 9F
07/23 00:11, 9F
哈哈果然是正解 xDDD
推
07/23 04:26, , 10F
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
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
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
07/24 01:08, 14F
推
07/24 01:14, , 15F
07/24 01:14, 15F
對不起 orz 我只是想要點出以前被 m 的文章可能誤導人的地方而已。
→
07/24 01:49, , 16F
07/24 01:49, 16F
→
07/24 02:10, , 17F
07/24 02:10, 17F
因為 printf 後面有不定數量的參數,所以實務上編譯器沒有辦法做太多轉
型。這跟寫死 32 位元的參數不一樣;因為如果寫死的話,編譯器事前可以知道
要把參量轉型成 32 位元。實務上如果 64 位元的參量要拆成兩部份傳,就可能
發生災難(一個參量被當成兩個參量)。我現在在用的電腦是 AMD64, 它的 ABI
規定每個參數都是用 64 位元來對齊,然後暫存器也是 64 位元,所以在這例子
中沒辦法提供驚人的結果 xD
(我知道 gcc 一般會按照平台預設的 ABI, 然後我也知道我自己用的 ABI
長什麼樣子。只是這些 C 標準什麼都沒講,也許有人用奇怪的 ABI 也說不定。)
→
07/24 01:50, , 18F
07/24 01:50, 18F
→
07/24 01:51, , 19F
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)
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章