看板 rikaka
作者 rikaka (rikaka)
標題 [C] 面試題目
時間 2012年04月09日 Mon. PM 03:27:52
int a=1;
a++*a++=?
++a*a++=?
++a*++a=?
屬於未定義之行為 請看下列連結的文章討論
該算式在不同編譯器下會有不同結果
http://blog.ez2learn.com/2008/09/27/evil-undefined-behavior/
.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
int i;
// i = ?? 會輸出 True
if (i != !!i)
{
cout << "True\n";
}
else
{
cout << "False\n";
}
return 0;
}
問題在於i要設成多少才會印出True?
i 設成不要是 0 和 1 , 應該都會印出 True
.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+
用c/c++寫一程式,將Ox1234(H)清除第5至第七個bit,再將第6個bit設成1,
然後答案以16進位顯示.
#include<stdio.h>
#include<stdlib.h>
void main()
{
long xx=0x1234;
long i=7;//0111
long g=1;/0001
xx=xx&(~(i<<4));
xx=xx|(g<<5);
printf("%x\n",xx);
}
.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+
void getMem(char *ptr)
{
ptr = (char*)malloc(100);
}
main()
{
char *str = NULL;
getMem(str);
strcpy(str, "Hello C/C++ programming");
printf("%s\n", str);
}
直接說結果好了
為什麼這樣會當機?
不是已經 call by pointer 了嗎
ptr 應該會得到新 malloc 的那堆空間
==================================
然後比較一下下面這題
void getMem(char **ptr, int num)
{
*ptr = (char*)malloc(200);
}
main()
{
char *str = NULL;
getMem(&str, 200);
strcpy(str, "Hello C/C++ programming");
printf("%s\n", str);
}
為什麼這樣就可以順利印出
Hello blah blah 那串?
推 VictorTom:是啊, ptr是拿到新空間啦, 但是沒有成功留給main裡的
str啊; 請去查一下pass by value與pass by reference.01/14 21:57
→ ThirdEmpire:可是他是 call by pointer 所以應該有留給main 不是嗎01/14 21:59
推 VictorTom:掛debug看看str與ptr的address/變化如何:)
話說, call by pointer又是哪裡出來的名詞啊....@_@"01/14 22:01
推 ledia:沒有 call by pointer 這種東西, 都是 call by value
竟然跟樓上同時 >/////<01/14 22:02
推 VictorTom:XD 我也是覺得call by address已經夠亂了, 現在又出來一種說法叫cal by pointer, 真是....(暈)....orz01/14 22:04
→ ThirdEmpire:我說的 call by pointer 就是 call by address 啦 sry01/14 22:06
→ fragileness:你先舉出一個利用你所謂的call by address,然後確定可正常執行的例子之後再說01/14 22:09
→ ThirdEmpire:OK 我好像懂了 關鍵就在 call by address
骨子裡還是 call by value 只是 data type 是 address01/14 22:13
推 chchwy:拜託 call by address/pointer 都是以訛傳訛的錯誤名詞
只有call by value / reference兩種而已01/14 23:06
→ adxis:我怎麼好像在PL課本上面看到 call by address -.-01/14 23:31
→ sunneo:call by lanpa01/14 23:39
推 mine1988:我大學老師也是教call by address01/14 23:51
推 conan77420:這是call by value吧
by address 跟by reference好像是刻意劃分C跟C++01/15 00:07
推 yayarice:雖然型態是pointer, 但這是call by value01/15 01:35
→ hilorrk:而且還會造成記憶體遺失...XD01/15 01:40
推 softwind:C只有call by value 只要記對的就好 其他都是錯的01/15 02:11
→ ledia:應該是求職面試.... 我好像也有遇過一樣的問題 (小聲)01/15 09:26
推 final01:沒有什麼錯不錯的問題吧
講法上的問題01/15 09:50
→ mantour:喜歡用call by pointer講也可以呀01/15 10:41
→ mantour:你在函式內要改變的是pointer本身的值,而不是point所指向的變數的值,就要傳指向這個pointer的pointer進去
嗯嗯 純粹只是說原PO會有這個問題並非名詞上的錯誤
而是對pointer的了解有問題
我個人是覺得一律用call by value來理解比較簡單
至於call by address是否為台灣人自創我不清楚01/15 10:42
函數的 paremeter 就是區域變數, 是函數一執行幫你配置的
區域變數就是離開 function 會被釋放, 無法取值
這是因為它會幫你拷貝一份 argument 到 parameter
成為新的變數, 不管裡面放的是位址(指標)或是值
所以你要傳指標進去, 出來還要拿到同一個指標
就要用指標的指標.. 多包了一層
抽象上的意義就不太一樣..
關於call by address這種問題,早就有人回答過了 直接貼原文
希望別再有人被誤導了
看板 Programming
作者 tinlans.bbs@bbs.csie.nctu.edu.tw (汀),
標題 Re: 請問call by referance !!
時間 交大資工鳳凰城資訊站 (Wed Sep 27 03:15:40 2006)
轉信 ptt!ctu-reader!ctu-peer!news.nctu!netnews.csie.nctu!netnews2.csie.nctu
───────────────────────────────────────
※ 引述《junshung@kkcity.com.tw (... (b) pic)》之銘言:
> 請問call by referance 跟call by adress 的用法有啥不同ㄋ
> 書上只寫說 它們效果一樣 但寫法不同 但我還是不太懂
> call by referance
如果你要的是泛用性的正式定義,
那麼 call by address == call by reference,
傳 pointer 只是 call by value,
不能稱之為 call by address,
目前世界上只有台灣本土人寫的書會稱之為 call by address,
其它外國的書或是翻譯書都不曾直接指名其為 call by address。
文魁出的某本綠皮 Visual C++ (位元文化編著) 是一大笑話,
說 C++ 有 call by value、call by address、call by reference 三種參數傳遞法,
深受其害的 C++ programmer 在台灣已不計其數,
上次還在 google 上看到有人投影片也這樣寫。
雖然你沒有說你問的是不是 C++,
但從問法上聽起來,
很可能是在看 C++ 相關而且內容有問題的中文書。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.112.206
推 flydragon198:我上課的時候,教授教的也是這三種,但是我一直都搞不清楚address和reference到底有什麼差@@2F 01/15 12:48
→ erotic:傳 *address 與 &reference4F 01/15 13:10
推 VictorTom:個人的理解是, CBV與CBR(或CBA)的差異在於, 傳入func的是l-value還是r-value; 傳入r-value的就是CBV, 反之CBR.所以中文書誤用很久的CBA其實是CBV, 只是這個value是透過pointer型態將變數的address傳入func; 而真正的CBA其實如這篇引文所說的, 應該是CBR才對. 不曉得這樣理解有沒有問題就是....@_@"5F 01/15 13:27
推 sorkayi:老實說 我也一直絕得只有兩種 可是一直聽到很多版本11F 01/15 20:27
推 VictorTom:剛發現精華區: z->2->8->6 也有解釋這件事:)12F 01/15 22:18
.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+
: char* getMem()
: {
: char * getmem;
: getmem = (char*)malloc(100);
: return getmem;
: }
: main()
: {
: char *str ;
: str = getMem();
: strcpy(str, "Hello C/C++ programming");
: printf("%s\n", str);
: getchar();
: }
: 那這樣可以的原因是...?
這樣可以的原因是:
你在getMen()函式裡面分配了一塊記憶體空間給程式
而且把這一塊空間的位置傳給了main裡面的str pointer
所以str pointer確實指著一塊切確的記憶體位置
.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+
void main(void)
{
int*a,*b;
a=1;
b=1;
printf("%d\n",a+b);
}
這是一題有關指標的題目
請問哪裡有錯??
面試官問我這題...讓我當場掛黑板...看來我C要重修了..
我一直看前面三行...他跟我說問題出在最後一行...
可是我到現在還找不到答案...希望有人幫我解答...謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.142.176.63
→ james732:看起來是兩個 int * 不能相加?
gcc: invalid operands to binary +
(have 「int *」 and 「int *」)2F 02/04 14:10
→ applecool:printf("%d\n",(int)(a+b));?5F 02/04 14:11
→ HPMC:基本上a=1就不對了ㄚ...6F 02/04 14:12
→ lungswu:我猜C(gnu c)的答案是5...等我看看7F 02/04 14:12
推 VictorTom:a=1與b=1沒有錯, 就跟=NULL =0是一樣的, 它只是init個值8F 02/04 14:13
→ james732:a = 1; b = 1; 其實是合法的 XD
printf("%d\n", (int)a + (int)b); <-- 大概要改這樣
要算出5的話應該是 printf("%d\n", a + (int)b);9F 02/04 14:13
→ VictorTom:會有問題的是對錯誤位址做讀寫動作....
考慮可行的改正方式來說, 可以有幾的方向, 大多都是對12F 02/04 14:14
→ HPMC:可是會有cannot convert from 'const int' to 'int *的結果..14F 02/04 14:15
→ VictorTom:int與int*的型態轉換; 而錯誤點主要在於, pointer可以直15F 02/04 14:15
→ james732:樓上用的編譯器是? 我用gcc會有警告但可以通過編譯16F 02/04 14:16
→ VictorTom:接加一個整數做offset, 但是直接加另一個指標是????17F 02/04 14:16
→ HPMC:VC++18F 02/04 14:16
→ VictorTom:再來就是對錯誤的位址做取值可能會有run-time error.19F 02/04 14:16
→ james732:不過這個程式沒有用 *a *b 的話就不會爆炸20F 02/04 14:18
推 VictorTom:剛用VC2005試了, C++會報error, C只會發warning....21F 02/04 14:19
→ james732:VC++真的會在a=1;b=1;那邊error 真怪...22F 02/04 14:20
→ lungswu:果然.james說的對, pointer之間不能相加,要a + (int)b23F 02/04 14:20
→ VictorTom:忘了C++的型別檢查比較嚴格; So, =NULL 算是特例吧XD24F 02/04 14:20
推 pharaoh7:我比較想知道 為啥答案是5......有誰可以告訴我一下= =25F 02/04 14:20
→ james732:5 = 1 + sizeof(int)26F 02/04 14:21
→ applecool:對不起我錯了 (int)(a+b)不行27F 02/04 14:21
→ HPMC:我也懂了....謝謝各位....29F 02/04 14:24
推 NorthRoad:不一定會是 5 .. 在 16 bit 系統底下會是 331F 02/04 14:46
→ final01:現在都考慮64bit吧32F 02/04 15:02
→ lungswu:這在64 bit(gcc 3.4)上也是5,除非是long *a, *b;33F 02/04 15:04
推 Arim:XD 指標不能相加 不過assignment那邊也怪怪的 一般不會這樣寫34F 02/04 15:39
→ yoco315:這什麼題目 = = 面試官要重修 C 才是真的...
哪一間啊?我要跟學弟們說不要去這家...36F 02/04 19:03
推 creeds:我也覺得這個問題問的不夠明確- -40F 02/05 00:44
推 ledia:我也覺得考官要重修 C ..... XD41F 02/05 09:05
→ Splash5:如果是寫單晶片 那a=1, b=1也許合理 但一般os 都會掛吧XD當然 要說compiler可以pass就沒有錯 那也可以XD..
那這世界上一堆bug都不是bug了XD42F 02/05 13:39
推 VictorTom:反正考官是問code的問題, 就看受試者說不說的出一套來:D45F 02/05 13:59
推 layan:指標不能相加...46F 08/08 10:18
.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+
--
※ 作者: rikaka 時間: 2012-04-09 15:27:52