找 C/C++ 考题

最初由 mooncake 发布

第二题,再想想

你是对的. 标准 C 规定函数调用参数从右到左进栈. 但有编译器也支持 pascal 调用规范(从左到右), 如 Borland C++.

尽管C标准规定了参数进栈次序, 但未规定参数计值次序. 所以出现不同的结果就不奇怪了.
 
最初由 dragonLinux 发布


这个我不能完全同意,libc的函数调用使用什么规则完全可以自己定,只不过你用了特殊的后,其它软件可能不知道就不能用了,就象windows一些api必须是winapi一样,大家必须遵守一个共同的规定而已。
至于 pascal的调用规范,我不知道是谁发明的,至少它也有它的优势相对C调用规范,就是节省代码空间。
实际上求值和入栈并不一定同样顺序,是可以这样,也不至于找抽吧,至少人家也懂些东西,总比不懂强。虽然这样的题没什么大意义,但至少这代表了一个人的知识宽度。
windos api 必须使用stdcall calling convension 是从安全性考虑的结果。利用编译器的特殊性达到某种目的必须要避免。这是一个成熟程序员的基本常识。尤其是这种完全可以而且毫无好处的情况。如果把心思放在怎样使自己的代码看上去更cool,这样的程序员成事不足,败事有余。如果我是manager,我的程序员写这样的程序,必须限期改正,否则自己背包袱走人。
 
最初由 dragonLinux 发布

告诉我从左到右入栈怎么实现...参数传递?什么意思?
就是pascal calling convention 怎么实现printf(const char* fmt, ...);
 
最初由 mooncake 发布

windos api 必须使用stdcall calling convension 是从安全性考虑的结果。利用编译器的特殊性达到某种目的必须要避免。这是一个成熟程序员的基本常识。尤其是这种完全可以而且毫无好处的情况。如果把心思放在怎样使自己的代码看上去更cool,这样的程序员成事不足,败事有余。如果我是manager,我的程序员写这样的程序,必须限期改正,否则自己背包袱走人。

1.windos api 必须使用stdcall calling convension 是从安全性考虑的结果。
为什么?本身就是有优势啊。
2.利用编译器的特殊性达到某种目的必须要避免。这是一个成熟程序员的基本常识。尤其是这种完全可以而且毫无好处的情况。如果把心思放在怎样使自己的代码看上去更cool,这样的程序员成事不足,败事有余。如果我是manager,我的程序员写这样的程序,必须限期改正,否则自己背包袱走人。
某些东西不能完全这样看待,如linux内核就大量利用gcc特性,可能是有些面窄,但是我们需要优化啊!当然上面的代码无优化可言,只是一种代码的简洁,对编译器毫无意义!
看过一个DVD解码程序只有一句,但也有上几K了。
我同意你们的看法,但是也是要有区分的。

这只是个面试题,没办法你是答还是不答?不答肯定是得不到职位的,没办法硬着头皮来吧。
 
最初由 mooncake 发布

就是pascal calling convention 怎么实现printf(const char* fmt, ...);
在pascal语言中,好象只有writexx之类的输出语句,它的实现方法是把输出细分成string,integer的,分成最简单的write,然后就可以实现了,因为此时已经知道如何回收栈了对于被调用函数。
当然在c 语言中,printf都是用C调用规范的,否则估计也要这样实现了,挺麻烦的。
 
两个int类型的数据,不用任何的判断语句如if、switch、?:等,找出其中的大值
从网上搜的,挺有意思!有答案啊,别认为不可能啊!
 
现在 interview 的 C/C++笔试题难易程度如何,一般多长时间, 哪位有经验?
 
[ZT]
某软件公司的一道笔试题:

1~100共一百个自然数,放入一个99个元素的数组a[99],要求写出一个尽量简单的方案,找出没有被放入数组的这个数
 
最初由 dragonLinux 发布


1.windos api 必须使用stdcall calling convension 是从安全性考虑的结果。
为什么?本身就是有优势啊。
2.利用编译器的特殊性达到某种目的必须要避免。这是一个成熟程序员的基本常识。尤其是这种完全可以而且毫无好处的情况。如果把心思放在怎样使自己的代码看上去更cool,这样的程序员成事不足,败事有余。如果我是manager,我的程序员写这样的程序,必须限期改正,否则自己背包袱走人。
某些东西不能完全这样看待,如linux内核就大量利用gcc特性,可能是有些面窄,但是我们需要优化啊!当然上面的代码无优化可言,只是一种代码的简洁,对编译器毫无意义!
看过一个DVD解码程序只有一句,但也有上几K了。
我同意你们的看法,但是也是要有区分的。

这只是个面试题,没办法你是答还是不答?不答肯定是得不到职位的,没办法硬着头皮来吧。
don't want to discuss any more, good luck on finding your job.
 
最初由 老兵新手 发布
[ZT]
某软件公司的一道笔试题:

1~100共一百个自然数,放入一个99个元素的数组a[99],要求写出一个尽量简单的方案,找出没有被放入数组的这个数
我在国内时好象看到过这个题。
不过,这类题只适合纯软件职位,我在这边面试还没有公司出过这类题,只是问问你的经验。一般来说这种题,如果没接触过,很难短时间内想出最佳方案。
 
最初由 dragonLinux 发布

我在国内时好象看到过这个题。
不过,这类题只适合纯软件职位,我在这边面试还没有公司出过这类题,只是问问你的经验。一般来说这种题,如果没接触过,很难短时间内想出最佳方案。

这道题有点脑筋急转弯的味道. 答案出人意料. 最佳解据说是一中学生给的. 如果从纯软件角度, 很难有最佳解.
 
最初由 老兵新手 发布
贴出来让大伙开开眼界吧!

这个是去年得奖的。

代码:
main(O){int I,Q,l=O;if(I=l*4){l=6;if(l>5)l+=Q-8?l-(Q=getchar()-2)%2:l;if(Q*=2)O+="has dirtiest IF"[(I/-Q&12)-l/Q%4];}printf("%d\n",8+O%4);}

编译运行,输入值是下面这样的ASCII Graph,自已试试。

代码:
 #   ###
##  #   #
 #  #   #
 #  #   #
###  ###
 
这个怎么样?:D

代码:
                                  #include\
                                  <stdio.h>
                     #include                <stdlib.h>
                     #include                <string.h>

                    #define w "Hk~HdA=Jk|Jk~LSyL[{M[wMcxNksNss:"
                   #define r"Ht@H|@=HdJHtJHdYHtY:HtFHtF=JDBIl"\
                  "DJTEJDFIlMIlM:HdMHdM=I|KIlMJTOJDOIlWITY:8Y"
                 #define S"IT@I\\@=HdHHtGH|KILJJDIJDH:H|KID"\
                "K=HdQHtPH|TIDRJDRJDQ:JC?JK?=JDRJLRI|UItU:8T"
               #define _(i,j)L[i=2*T[j,O[i=O[j-R[j,T[i=2*\
              R[j-5*T[j+4*O[j-L[j,R[i=3*T[j-R[j-3*O[j+L[j,
             #define t"IS?I\\@=HdGHtGIDJILIJDIItHJTFJDF:8J"

    #define y                  yy(4),yy(5),                yy(6),yy(7)
  #define yy(              i)R[i]=T[i],T[i ]            =O[i],O[i]=L [i]
#define Y _(0          ], 4] )_ (1 ], 5] )_ (2      ], 6] )_ (3 ], 7] )_=1
#define v(i)(      (( R[ i ] * _ + T [ i ]) * _ + O [ i ]) * _ + L [ i ]) *2
double b = 32  ,l ,k ,o ,B ,_ ; int Q , s , V , R [8 ], T[ 8] ,O [8 ], L[ 8] ;
#define q( Q,R ) R= *X ++ % 64 *8 ,R |= *X /8 &7 ,Q=*X++%8,Q=Q*64+*X++%64-256,
# define  p      "G\\QG\\P=GLPGTPGdMGdNGtOGlOG"   "dSGdRGDPGLPG\\LG\\LHtGHtH:"
#  define W         "Hs?H{?=HdGH|FI\\II\\GJlHJ"    "lFL\\DLTCMlAM\\@Ns}Nk|:8G"
# define   U           "EDGEDH=EtCElDH{~H|AJk}"       "Jk?LSzL[|M[wMcxNksNst:"
#  define u                  "Hs?H|@=HdFHtEI"             "\\HI\\FJLHJTD:8H"
char  *   x                   ,*X , ( * i )[               640],z[3]="4_",
*Z = "4,8O4.8O4G" r U "4M"u S"4R"u t"4S8CHdDH|E=HtAIDAIt@IlAJTCJDCIlKI\\K:8K"U
 "4TDdWDdW=D\\UD\\VF\\FFdHGtCGtEIDBIDDIlBIdDJT@JLC:8D"t"4UGDNG\\L=GDJGLKHL\
FHLGHtEHtE:"p"4ZFDTFLT=G|EGlHITBH|DIlDIdE:HtMH|M=JDBJLDKLAKDALDFKtFKdMK\
\\LJTOJ\\NJTMJTM:8M4aGtFGlG=G|HG|H:G\\IG\\J=G|IG|I:GdKGlL=G|JG|J:4b"W
S"4d"W t t"4g"r w"4iGlIGlK=G|JG|J:4kHl@Ht@=HdDHtCHdPH|P:HdDHdD=It\
BIlDJTEJDFIdNI\\N:8N"w"4lID@IL@=HlIH|FHlPH|NHt^H|^:H|MH|N=J\\D\
J\\GK\\OKTOKDXJtXItZI|YIlWI|V:8^4mHLGH\\G=HLVH\\V:4n" u t t
"4p"W"IT@I\\@=HdHHtGIDKILIJLGJLG:JK?JK?=JDGJLGI|MJDL:8M4\
rHt@H|@=HtDH|BJdLJTH:ITEI\\E=ILPILNNtCNlB:8N4t"W t"4u"
p"4zI[?Il@=HlHH|HIDLILIJDII|HKDAJ|A:JtCJtC=JdLJtJL\
THLdFNk|Nc|\
:8K"; main (
int C,char**        A) {for(x=A[1],i=calloc(strlen(x)+2,163840);
C-1;C<3?Q=_=       0,(z[1]=*x++)?((*x++==104?z[1]^=32:--x), X =
strstr(Z,z))      &&(X+=C++): (printf("P2 %d 320 4 ",V=b/2+32),
V*=2,s=Q=0,C     =4):C<4?Q-->0?i[(int)((l+=o)+b)][(int)(k+=B)
]=1:_?_-=.5/    256,o=(v(2)-(l=v(0)))/(Q=16),B=(v(3)-(k=v(1)
))/Q:*X>60?y   ,q(L[4],L[5])q(L[6],L[7])*X-61||(++X,y,y,y),
Y:*X>57?++X,  y,Y:*X >54?++X,b+=*X++%64*4:--C: printf("%d "
,i[Q][s]+i[Q ][s+1]+i[Q+1][s]+i[Q+1][s+1])&&(Q+=2)<V||(Q=
0,s+=2)<640
||(C=1));}

编译运行,试试:

./anonymous "ash nazg durhbatuluhk, ash nazg gimbatul, \
ash nazg thrakatuluhk, agh burzhumh-ishi krimpatul." >anonymous.pgm

然后可以用netpbm来看生成的anonymous.pgm
 
最初由 shusheng 发布


这个是去年得奖的。

代码:
main(O){int I,Q,l=O;if(I=l*4){l=6;if(l>5)l+=Q-8?l-(Q=getchar()-2)%2:l;if(Q*=2)O+="has dirtiest IF"[(I/-Q&12)-l/Q%4];}printf("%d\n",8+O%4);}

编译运行,输入值是下面这样的ASCII Graph,自已试试。

代码:
 #   ###
##  #   #
 #  #   #
 #  #   #
###  ###

没看明白,这程序逻辑也不对吧?
 
后退
顶部