Q:printf和scanf的返回值是什么?
int main()
{讯享网</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">int</span> i = <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">43</span><span style="margin:0px; padding:0px; line-height:1.5!important">; </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">int</span> n = printf(<span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%d",i);printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%d",n);讯享网</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span><span style="margin:0px; padding:0px; line-height:1.5!important">;}
讯享网
A:printf函数返回3。由于其输出了‘4‘, ‘3‘, ‘ ‘ 三个字符。
Q:此段程序希望输出数组中的全部元素。但却没有得到想要的结果,是什么产生歧义?
#include <stdio.h> #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0])) int array[] = {23,34,12,17,204,99,16}; int main() {讯享网</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">int</span><span style="margin:0px; padding:0px; line-height:1.5!important"> d; </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">for</span>(d=-<span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">1</span>;d <= (TOTAL_ELEMENTS-<span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">2</span>);d++<span style="margin:0px; padding:0px; line-height:1.5!important">) printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%d",array[d+1]);</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span><span style="margin:0px; padding:0px; line-height:1.5!important">;}
A:执行上面的程序。结果是什么都没有输出,导致这个结果的原因是sizeof的返回值是一个unsinged int,为此在比較int d 和TOTAL_ELEMENTS两个值都被转换成了unsigned int来进行比較,这样就导致-1被转换成一个很大的值,以至于for循环不满足条件。因此,假设不能理解sizeof操作符返回的是一个unsigned int的话,就会产生类似如上的歧义。
Q:以下这段程序的输出结果是:
讯享网#include <stdio.h> #define f(a,b) ab #define g(a) #a #define h(a) g(a)
int main() {printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%s", h(f(1,2)));讯享网printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%s", g(f(1,2)));</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span><span style="margin:0px; padding:0px; line-height:1.5!important">;}
对于h(f(1,2)),由于h(a)是非#或的普通宏。须要先宏展开其參数a,即展开f(1,2)为12,则h(a) 宏替换为h(12)。进而宏替换为g(12), 进而宏替换为"12"。
Q:假如我们的a的地址是:0Xbfe2e100, 并且是32位机,那么这个程序会输出什么?
讯享网#include <stdio.h> int main() {</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">int</span> a[<span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">5</span><span style="margin:0px; padding:0px; line-height:1.5!important">]; printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%x", a);讯享网printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%x", a+1);printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%x", &a);讯享网printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%x", &a+1);</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span><span style="margin:0px; padding:0px; line-height:1.5!important">;}
A:
第一条printf语句应该没有问题,就是 bfe2e100。
第二条printf语句你可能会以为是bfe2e101。那就错了。a+1。编译器会编译成 a+ 1*sizeof(int),int在32位下是4字节。所以是加4,也就是bfe2e104。
第三条printf语句可能是你最头疼的。我们怎么知道a的地址?我不知道吗?可不就是bfe2e100。那岂不成了a==&a啦?这怎么可能?自己存自己的?或许非常多人会认为指针和数组是一回事,那么你就错了。假设是 int a,那么没有问题,由于a是指针。所以 &a 是指针的地址,a 和 &a不一样。可是这是数组啊a[],所以&a事实上是被编译成了 &a[0]。
第四条printf语句就非常自然了。就是bfe2e104。还是不正确,由于是&a是数组,被看成int()[5]。所以sizeof(a)是5,也就是5*sizeof(int)。也就是bfe2e114。
Q:例如以下代码为什么结果始终不正确?
讯享网#include <stdio.h> int main() {</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">int</span> a = <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">2</span><span style="margin:0px; padding:0px; line-height:1.5!important">; </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">if</span>(a & <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">1</span> == <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span><span style="margin:0px; padding:0px; line-height:1.5!important">) printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">a & 1 == 0</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; line-height:1.5!important">); </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">else</span><span style="margin:0px; padding:0px; line-height:1.5!important"> printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">a & 1 != 0</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; line-height:1.5!important">); </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span><span style="margin:0px; padding:0px; line-height:1.5!important">;}
(优先级:==和!= 高于 & 高于 ^ 高于 | 高于 && 高于 || )。
优先级从高到低:算术运算符,位移运算符,关系运算符,位操作& ^ |
Q:例如以下代码输出什么?
讯享网int main() {</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">int</span> i = <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">6</span><span style="margin:0px; padding:0px; line-height:1.5!important">; </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">if</span>( ((++i < <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">7</span>) && ( i++/<span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">6</span>)) || (++i <= <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">9</span><span style="margin:0px; padding:0px; line-height:1.5!important">)); printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%d",i);讯享网</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span><span style="margin:0px; padding:0px; line-height:1.5!important">;}
A:8。本题主要考的是&&和||的短路求值的问题。所为短路求值:对于(条件1 && 条件2)。假设“条件1”是false,那“条件2”的表达式会被忽略了。对于(条件1 || 条件2),假设“条件1”为true,而“条件2”的表达式则被忽略了。
Q:sizeof后面能够跟表达式,以下的代码,为什么i++无效呢?
#include <stdio.h> int main() {讯享网</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">int</span> i = <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">1</span><span style="margin:0px; padding:0px; line-height:1.5!important">; </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">sizeof</span>(i++<span style="margin:0px; padding:0px; line-height:1.5!important">); printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%d", i);</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span><span style="margin:0px; padding:0px; line-height:1.5!important">;}

Q:以下的程序试图使用“位操作”来完毕“乘5”的操作,只是这个程序中有个BUG,你知道是什么吗?
讯享网#include <stdio.h> #define PrintInt(expr) printf("%s : %d ",#expr,(expr)) int FiveTimes(int a) {</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">int</span><span style="margin:0px; padding:0px; line-height:1.5!important"> t; t </span>= a<<<span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">2</span> +<span style="margin:0px; padding:0px; line-height:1.5!important"> a; </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span><span style="margin:0px; padding:0px; line-height:1.5!important"> t;} int main() {讯享网</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">int</span> a = <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">1</span><span style="margin:0px; padding:0px; line-height:1.5!important">; PrintInt(FiveTimes(a)); </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span><span style="margin:0px; padding:0px; line-height:1.5!important">;}
A:本题的问题在于函数FiveTimes中的表达式“t = a<<2 + a;”,对于a<<2这个位操作,优先级要比加法要低,所以这个表达式就成了“t = a << (2+a)”,于是我们就得不到我们想要的值。
该程序修正例如以下:“t = (a<<2) + a;”
Q:例如以下代码关于位运算符的操作为何终于结果和预期不符?
#include <stdio.h> int main() {讯享网unsigned </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">char</span> c = <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0xfc</span><span style="margin:0px; padding:0px; line-height:1.5!important">; unsigned </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">int</span> i = ~<span style="margin:0px; padding:0px; line-height:1.5!important">c; printf(</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">"</span><span style="margin:0px; padding:0px; color:rgb(128,0,0); line-height:1.5!important">%x",i);</span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span><span style="margin:0px; padding:0px; line-height:1.5!important">;}
执行结果:0xffffff03
依照上面的代码,~c应该得到的是0x03, 那么结果应该是0x03, 怎么会是上面的结果呢?
A:这是由于位运算是被提升到整形运算的。
上面的变量c是无符号字符型,在进行~位运算时,是首先提升为整形,即为0x000000fc, 然后取反得到0xffffff03, 所以i得到的数值是这个。同理。假设c是char类型。提升为整形时为0xfffffffc。再取反得到的就是0x03。事实上变量被提升有非常多地方。比方short计算时也会提升为int再继续计算。
Q:以下这个程序运行后会有什么错误或者效果:
讯享网#define MAX 255 int main() {unsigned </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">char</span><span style="margin:0px; padding:0px; line-height:1.5!important"> A[MAX]; unsigned chat i; </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">for</span> (i = <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">0</span>; i <= MAX; i++<span style="margin:0px; padding:0px; line-height:1.5!important">) A[i] </span>=<span style="margin:0px; padding:0px; line-height:1.5!important"> i;}
Q:有a和b两个整型变量,不用“if”,“? :”,“switch”或者是其它推断语句,怎样得到大者和小者?
A:大者:((a+b)+abs(a-b))/2
小者:((a+b)-abs(a-b))/2
讯享网#define MAX(a,b) ((((a)-(b))&(1<<31))?(b):(a))
Q:定义一个宏,求一个结构体struct中某个变量相对于struct的偏移量
A:#define OFFSET(struct, member) ((unsigned int)&((struct *)0)->member)
Q:求不小于x的最小的2的K次方的数:
讯享网int pow2_ceil(unsigned int x) {x</span>--<span style="margin:0px; padding:0px; line-height:1.5!important">; x </span>|= x >> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">1</span><span style="margin:0px; padding:0px; line-height:1.5!important">; x </span>|= x >> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">2</span><span style="margin:0px; padding:0px; line-height:1.5!important">; x </span>|= x >> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">4</span><span style="margin:0px; padding:0px; line-height:1.5!important">; x </span>|= x >> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">8</span><span style="margin:0px; padding:0px; line-height:1.5!important">; x </span>|= x >> <span style="margin:0px; padding:0px; color:rgb(128,0,128); line-height:1.5!important">16</span><span style="margin:0px; padding:0px; line-height:1.5!important">; x</span>++<span style="margin:0px; padding:0px; line-height:1.5!important">; </span><span style="margin:0px; padding:0px; color:rgb(0,0,255); line-height:1.5!important">return</span><span style="margin:0px; padding:0px; line-height:1.5!important"> x;}
灵活的位操作能够有效地提高程序执行的效率:
1.设置x的bit5为1,其它位不变:x |= (1<<5);
2.设置x的bit5为0。其它位不变:x &= ~(1<<5);
3.推断x的bit5是否为1。(x & (1<<5)) != 0 ?
关于C中volatilekeyword的作用:一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样。编译器就不会去如果这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地又一次读取这个变量的值,而不是使用保存在寄存器里的备份。
以下是volatile变量的几个样例:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会訪问到的非自己主动变量(Non-automatic variables,自己主动变量是auto或register变量)
3). 多线程应用中被几个任务共享的变量:volatile keyword告诉编译器不要持有变量的暂时性拷贝。
请看下面情形:A线程将变量复制入寄存器,然后进入循环,重复检測寄存器的值是否满足一定条件。它期待B线程改变变量的值。在此种情况下,当B线程改变了变量的值时。已改变的值对其在寄存器的值没有影响。所以A线程进入死循环。
几道C笔试题

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/138214.html