今天2群里的一位兄弟去面试了,回来出了这么一道TX合肥分公司的笔试题~ 代码: int a=3,b=5; printf (a ,b ); printf ( "%c%c%c%c" ,1 ,2 ,0 ,5 ); 问:输出什么? 因为大家之前很多人没碰到过这类语法,所以都上机调了下。 结果第二句代码是Hello,第三句代码是swde。 关于a 这类语法,之前也没遇到过,因此反汇编出来看。 5: int a=3,b=5; 00401028 mov dword ptr , 30040102F mov dword ptr ,5 6: printf(a ,b ); 00401036 mov eax,dword ptr 00401039 add eax,offset string "fun/super" (00422028) 0040103E push eax 0040103F mov ecx,dword ptr 00401042 add ecx,offset string "Hi!Hello" (0042201c) 00401048 push ecx 00401049 call printf (00401080) 0040104E add esp,8 从这里我们可以看出来a 事实上是取了字符串中索引为a值开头,直到字符串结束的串。因为a是3,所以0,1,2,3分别对应H,i,!,H。所以结果是Hello。至于为什么没 有取到后面的字符串,原因很简单,虽然参加了运算,但是压栈从右至左,而又没有格式化符号,所以输出的只有最左边的Hello了。 那么第三句代码也类似,就不反汇编了,从右到左分别取e,d,w,s。然后按照格式化符号的相关格式依次显示。 另外,第二条代码再作点说明,从这个结果可以推出printf("xxx", "aaaaa");因为没有格式化符号只会显示xxx。而且根据我们的经验也可以知道这个结果,那么反推之前题目中只显示Hello也不难理解了~ 总之,今天收获不少,希望可以和大家共同进步~ 感谢诸位群友的讨论~ 嗯~刚刚收到群友提供的MSDN对于默认参数设置的说明: If there are more arguments than there are format specifications, the extra arguments are ignored. 超过格式化符号个数的参数,将被忽略。 The results are undefined if there are not enough arguments for all the format specifications. 如果没有足够的参数对应其格式化,其结果将是不确定的。