看板 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 那串?
推 :是啊, ptr是拿到新空間啦, 但是沒有成功留給main裡的01/14 21:57
→ :str啊; 請去查一下pass by value與pass by reference.
→ :str啊; 請去查一下pass by value與pass by reference.
→ :可是他是 call by pointer 所以應該有留給main 不是嗎01/14 21:59
推 :掛debug看看str與ptr的address/變化如何:)01/14 22:01
→ :話說, call by pointer又是哪裡出來的名詞啊....@_@"
→ :話說, call by pointer又是哪裡出來的名詞啊....@_@"
推 :沒有 call by pointer 這種東西, 都是 call by value01/14 22:02
→ :竟然跟樓上同時 >/////<
→ :竟然跟樓上同時 >/////<
推 :XD 我也是覺得call by address已經夠亂了, 現在又出來一01/14 22:04
→ :種說法叫cal by pointer, 真是....(暈)....orz
→ :種說法叫cal by pointer, 真是....(暈)....orz
→ :我說的 call by pointer 就是 call by address 啦 sry01/14 22:06
→ :你先舉出一個利用你所謂的call by address,然後確定01/14 22:09
→ :可正常執行的例子之後再說
→ :可正常執行的例子之後再說
→ :OK 我好像懂了 關鍵就在 call by address01/14 22:13
→ :骨子裡還是 call by value 只是 data type 是 address
→ :骨子裡還是 call by value 只是 data type 是 address
推 :拜託 call by address/pointer 都是以訛傳訛的錯誤名詞01/14 23:06
→ :只有call by value / reference兩種而已
→ :只有call by value / reference兩種而已
→ :我怎麼好像在PL課本上面看到 call by address -.-01/14 23:31
→ :call by lanpa01/14 23:39
推 :我大學老師也是教call by address01/14 23:51
→ :可以問一下這是啥場合的面試嗎?01/14 23:53
推 :這是call by value吧01/15 00:07
→ :by address 跟by reference好像是刻意劃分C跟C++
→ :by address 跟by reference好像是刻意劃分C跟C++
推 :雖然型態是pointer, 但這是call by value01/15 01:35
→ :而且還會造成記憶體遺失...XD01/15 01:40
推 :C只有call by value 只要記對的就好 其他都是錯的01/15 02:11
推 :#16r2cr6m01/15 03:50
→ :應該是求職面試.... 我好像也有遇過一樣的問題 (小聲)01/15 09:26
推 :沒有什麼錯不錯的問題吧01/15 09:50
→ :講法上的問題
→ :講法上的問題
→ :喜歡用call by pointer講也可以呀01/15 10:41
推 :台灣人自創的講法 老外聽不懂滴01/15 10:41
→ :你在函式內要改變的是pointer本身的值,而不是point所指01/15 10:42
→ :向的變數的值,就要傳指向這個pointer的pointer進去
→ :嗯嗯 純粹只是說原PO會有這個問題並非名詞上的錯誤
→ :而是對pointer的了解有問題
→ :我個人是覺得一律用call by value來理解比較簡單
→ :至於call by address是否為台灣人自創我不清楚
→ :向的變數的值,就要傳指向這個pointer的pointer進去
→ :嗯嗯 純粹只是說原PO會有這個問題並非名詞上的錯誤
→ :而是對pointer的了解有問題
→ :我個人是覺得一律用call by value來理解比較簡單
→ :至於call by address是否為台灣人自創我不清楚
推 :聖經本都說C只有call by value了01/15 10:45
函數的 paremeter 就是區域變數, 是函數一執行幫你配置的
區域變數就是離開 function 會被釋放, 無法取值
這是因為它會幫你拷貝一份 argument 到 parameter
成為新的變數, 不管裡面放的是位址(指標)或是值
所以你要傳指標進去, 出來還要拿到同一個指標
就要用指標的指標.. 多包了一層
抽象上的意義就不太一樣..
關於call by address這種問題,早就有人回答過了 直接貼原文
希望別再有人被誤導了
看板 Programming
作者 標題 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
推 :推這篇:)1F 01/15 11:10
推 :我上課的時候,教授教的也是這三種,但是我一直都搞2F 01/15 12:48
→ :不清楚address和reference到底有什麼差@@
→ :不清楚address和reference到底有什麼差@@
→ :傳 *address 與 &reference4F 01/15 13:10
推 :個人的理解是, CBV與CBR(或CBA)的差異在於, 傳入func的5F 01/15 13:27
→ :是l-value還是r-value; 傳入r-value的就是CBV, 反之CBR.
→ :所以中文書誤用很久的CBA其實是CBV, 只是這個value是透
→ :過pointer型態將變數的address傳入func; 而真正的CBA其
→ :實如這篇引文所說的, 應該是CBR才對. 不曉得這樣理解有
→ :沒有問題就是....@_@"
→ :是l-value還是r-value; 傳入r-value的就是CBV, 反之CBR.
→ :所以中文書誤用很久的CBA其實是CBV, 只是這個value是透
→ :過pointer型態將變數的address傳入func; 而真正的CBA其
→ :實如這篇引文所說的, 應該是CBR才對. 不曉得這樣理解有
→ :沒有問題就是....@_@"
推 :老實說 我也一直絕得只有兩種 可是一直聽到很多版本11F 01/15 20:27
推 :剛發現精華區: 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
→ :第一行 void 當回傳值不好1F 02/04 14:10
→ :看起來是兩個 int * 不能相加?2F 02/04 14:10
→ :gcc: invalid operands to binary +
→ : (have 「int *」 and 「int *」)
→ :gcc: invalid operands to binary +
→ : (have 「int *」 and 「int *」)
→ :printf("%d\n",(int)(a+b));?5F 02/04 14:11
→ :基本上a=1就不對了ㄚ...6F 02/04 14:12
→ :我猜C(gnu c)的答案是5...等我看看7F 02/04 14:12
推 :a=1與b=1沒有錯, 就跟=NULL =0是一樣的, 它只是init個值8F 02/04 14:13
→ :a = 1; b = 1; 其實是合法的 XD9F 02/04 14:13
→ :printf("%d\n", (int)a + (int)b); <-- 大概要改這樣
→ :要算出5的話應該是 printf("%d\n", a + (int)b);
→ :printf("%d\n", (int)a + (int)b); <-- 大概要改這樣
→ :要算出5的話應該是 printf("%d\n", a + (int)b);
→ :會有問題的是對錯誤位址做讀寫動作....12F 02/04 14:14
→ :考慮可行的改正方式來說, 可以有幾的方向, 大多都是對
→ :考慮可行的改正方式來說, 可以有幾的方向, 大多都是對
→ :可是會有cannot convert from 'const int' to 'int *的結果..14F 02/04 14:15
→ :int與int*的型態轉換; 而錯誤點主要在於, pointer可以直15F 02/04 14:15
→ :樓上用的編譯器是? 我用gcc會有警告但可以通過編譯16F 02/04 14:16
→ :接加一個整數做offset, 但是直接加另一個指標是????17F 02/04 14:16
→ :VC++18F 02/04 14:16
→ :再來就是對錯誤的位址做取值可能會有run-time error.19F 02/04 14:16
→ :不過這個程式沒有用 *a *b 的話就不會爆炸20F 02/04 14:18
推 :剛用VC2005試了, C++會報error, C只會發warning....21F 02/04 14:19
→ :VC++真的會在a=1;b=1;那邊error 真怪...22F 02/04 14:20
→ :果然.james說的對, pointer之間不能相加,要a + (int)b23F 02/04 14:20
→ :忘了C++的型別檢查比較嚴格; So, =NULL 算是特例吧XD24F 02/04 14:20
推 :我比較想知道 為啥答案是5......有誰可以告訴我一下= =25F 02/04 14:20
→ :5 = 1 + sizeof(int)26F 02/04 14:21
→ :對不起我錯了 (int)(a+b)不行27F 02/04 14:21
推 :懂了...28F 02/04 14:23
→ :我也懂了....謝謝各位....29F 02/04 14:24
推 :看板長知識 謝謝各位30F 02/04 14:28
推 :不一定會是 5 .. 在 16 bit 系統底下會是 331F 02/04 14:46
→ :現在都考慮64bit吧32F 02/04 15:02
→ :這在64 bit(gcc 3.4)上也是5,除非是long *a, *b;33F 02/04 15:04
推 :XD 指標不能相加 不過assignment那邊也怪怪的 一般不會這樣寫34F 02/04 15:39
推 :哪裡錯了??我覺得從頭錯到尾耶@@35F 02/04 18:19
→ :這什麼題目 = = 面試官要重修 C 才是真的...36F 02/04 19:03
→ :哪一間啊?我要跟學弟們說不要去這家...
→ :哪一間啊?我要跟學弟們說不要去這家...
→ :樓上才有問題...這就是考官要考你的概念阿38F 02/04 21:02
→ :真的喔..39F 02/04 21:48
推 :我也覺得這個問題問的不夠明確- -40F 02/05 00:44
推 :我也覺得考官要重修 C ..... XD41F 02/05 09:05
→ :如果是寫單晶片 那a=1, b=1也許合理 但一般os 都會掛吧XD42F 02/05 13:39
→ :當然 要說compiler可以pass就沒有錯 那也可以XD..
→ :那這世界上一堆bug都不是bug了XD
→ :當然 要說compiler可以pass就沒有錯 那也可以XD..
→ :那這世界上一堆bug都不是bug了XD
推 :反正考官是問code的問題, 就看受試者說不說的出一套來:D45F 02/05 13:59
推 :指標不能相加...46F 08/08 10:18
.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+
--
※ 作者: rikaka 時間: 2012-04-09 15:27:52
※ 看板: rikaka 文章推薦值: 0 目前人氣: 0 累積人氣: 5363
回列表(←)
分享