顯示廣告
隱藏 ✕
看板 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裡的01/14 21:57
VictorTom:str啊; 請去查一下pass by value與pass by reference.
ThirdEmpire:可是他是 call by pointer 所以應該有留給main 不是嗎01/14 21:59
VictorTom:掛debug看看str與ptr的address/變化如何:)01/14 22:01
VictorTom:話說, call by pointer又是哪裡出來的名詞啊....@_@"
ledia:沒有 call by pointer 這種東西, 都是 call by value01/14 22:02
ledia:竟然跟樓上同時 >/////<
VictorTom:XD 我也是覺得call by address已經夠亂了, 現在又出來一01/14 22:04
VictorTom:種說法叫cal by pointer, 真是....(暈)....orz
ThirdEmpire:我說的 call by pointer 就是 call by address 啦 sry01/14 22:06
fragileness:你先舉出一個利用你所謂的call by address,然後確定01/14 22:09
fragileness:可正常執行的例子之後再說
ThirdEmpire:OK 我好像懂了 關鍵就在 call by address01/14 22:13
ThirdEmpire:骨子裡還是 call by value 只是 data type 是 address
chchwy:拜託 call by address/pointer 都是以訛傳訛的錯誤名詞01/14 23:06
chchwy:只有call by value / reference兩種而已
adxis:我怎麼好像在PL課本上面看到 call by address -.-01/14 23:31
sunneo:call by lanpa01/14 23:39
mine1988:我大學老師也是教call by address01/14 23:51
loveme00835:可以問一下這是啥場合的面試嗎?01/14 23:53
conan77420:這是call by value吧01/15 00:07
conan77420:by address 跟by reference好像是刻意劃分C跟C++
yayarice:雖然型態是pointer, 但這是call by value01/15 01:35
hilorrk:而且還會造成記憶體遺失...XD01/15 01:40
softwind:C只有call by value 只要記對的就好 其他都是錯的01/15 02:11
csihcs:#16r2cr6m01/15 03:50
ledia:應該是求職面試.... 我好像也有遇過一樣的問題 (小聲)01/15 09:26
final01:沒有什麼錯不錯的問題吧01/15 09:50
final01:講法上的問題
mantour:喜歡用call by pointer講也可以呀01/15 10:41
stonehomelaa:台灣人自創的講法 老外聽不懂滴01/15 10:41
mantour:你在函式內要改變的是pointer本身的值,而不是point所指01/15 10:42
mantour:向的變數的值,就要傳指向這個pointer的pointer進去
mantour:嗯嗯 純粹只是說原PO會有這個問題並非名詞上的錯誤
mantour:而是對pointer的了解有問題
mantour:我個人是覺得一律用call by value來理解比較簡單
mantour:至於call by address是否為台灣人自創我不清楚
stonehomelaa:聖經本都說C只有call by value了01/15 10:45

函數的 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
VictorTom:推這篇:)1F 01/15 11:10
flydragon198:我上課的時候,教授教的也是這三種,但是我一直都搞2F 01/15 12:48
flydragon198:不清楚address和reference到底有什麼差@@
erotic:傳 *address 與 &reference4F 01/15 13:10
VictorTom:個人的理解是, CBV與CBR(或CBA)的差異在於, 傳入func的5F 01/15 13:27
VictorTom:是l-value還是r-value; 傳入r-value的就是CBV, 反之CBR.
VictorTom:所以中文書誤用很久的CBA其實是CBV, 只是這個value是透
VictorTom:過pointer型態將變數的address傳入func; 而真正的CBA其
VictorTom:實如這篇引文所說的, 應該是CBR才對. 不曉得這樣理解有
VictorTom:沒有問題就是....@_@"
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
applecool:第一行 void 當回傳值不好1F 02/04 14:10
james732:看起來是兩個 int * 不能相加?2F 02/04 14:10
james732:gcc: invalid operands to binary +
james732:              (have 「int *」 and 「int *」)
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; 其實是合法的 XD9F 02/04 14:13
james732:printf("%d\n", (int)a + (int)b);  <-- 大概要改這樣
james732:要算出5的話應該是 printf("%d\n", a + (int)b);
VictorTom:會有問題的是對錯誤位址做讀寫動作....12F 02/04 14:14
VictorTom:考慮可行的改正方式來說, 可以有幾的方向, 大多都是對
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
pharaoh7:懂了...28F 02/04 14:23
HPMC:我也懂了....謝謝各位....29F 02/04 14:24
applecool:看板長知識   謝謝各位30F 02/04 14:28
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
flydragon198:哪裡錯了??我覺得從頭錯到尾耶@@35F 02/04 18:19
yoco315:這什麼題目 = = 面試官要重修 C 才是真的...36F 02/04 19:03
yoco315:哪一間啊?我要跟學弟們說不要去這家...
chister789:樓上才有問題...這就是考官要考你的概念阿38F 02/04 21:02
yoco315:真的喔..39F 02/04 21:48
creeds:我也覺得這個問題問的不夠明確- -40F 02/05 00:44
ledia:我也覺得考官要重修 C ..... XD41F 02/05 09:05
Splash5:如果是寫單晶片 那a=1, b=1也許合理 但一般os 都會掛吧XD42F 02/05 13:39
Splash5:當然 要說compiler可以pass就沒有錯 那也可以XD..
Splash5:那這世界上一堆bug都不是bug了XD
VictorTom:反正考官是問code的問題, 就看受試者說不說的出一套來:D45F 02/05 13:59
layan:指標不能相加...46F 08/08 10:18

.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+.*.+



--
※ 作者: rikaka 時間: 2012-04-09 15:27:52
※ 看板: rikaka 文章推薦值: 0 目前人氣: 0 累積人氣: 5363 
分享網址: 複製 已複製
guest
x)推文 r)回覆 e)編輯 d)刪除 M)收藏 ^x)轉錄 同主題: =)首篇 [)上篇 ])下篇