注:谢谢您的信任,我是昨天做了那10多题的网友,第一,我也在学习C++,所以想帮帮您,第二,我也在验证我的知识,扩充我的知识,所以来看看。如有错误,请指出,大家共同进步……
【1】选(C)
printf(“%d\n”, d=a>b?(a>c?a: c): b);这一句判断的语法是,括号优先级最高,这查表或者自己都可以记住的,由于括号的优先级最高,先看括号内容(a>c?a: c),显然是a与c的大小判断,(a>c?a: c)它的意思是a>c吗?如果大于,则取冒号前面的项,如果小于则取冒号后面的项(等于的话算作不大于)。有a等于5,b等于4,c等于6可知,c是大于a的,那么(a>c?a: c)的结果是6,取的是c。然后再看(d=a>b?(a>c?a: c): b)简化成(d=a>b?6: b),由于赋值符号=符号的出现,那么显然是说明a>b?6: b这个语句的结果最后要赋值给d,那么相同原理,a大于b,因此取6(即冒号前面的项)。所以d=6
【2】选(A)
d = !a && !b || !c;要明确“非”符号的最高的逻辑算符。因此刚刚的语句可以看作是d = (!a )&&( !b )||( !c)。再明确的是&&和||两个符号是,是至左而右进行处理的。它这句语法的意思是,非a与非b是且关系么?如果得到结果再与非c看看或关系的结果,再最终得出结果。显然非a是0,之前说过,只要是非零就是真,在编译器里面是这么定义的,书本上则不然,只是因为编译器的缘故,我们才认为非零就是真,非b也是0,非c是1。非a与非b且的结果是1,然后1再和非c的1去得到或关系,最终结果是1。
【3】选(C)
先看主函数main(), void main(void) {int i, a = 0;for (i=0; i<5; i++) a += f()printf(“%d\n”, a);},它这个函数的基本意思就是,定义了i和a,那么通过i,其实实现的是a的数次赋值,数次加和。看一下f()函数,static int i = 0;int s =1;s += i;i++;return (s);请注意static关键词,这个表示静态量,当它定义在函数内,表示的是函数内的局部变量,局部变量只能在定义它的函数中使用。那么意味着这个F()函数里面的i,却只能在f()函数里面传递数值,不可以传出去,并且定义static关键词的变量还有一个作用就是在f()函数中第一句就是定义赋值static int i = 0,再下次调用的时候,不再执行这条语句,也就是说,static变量的最最最初始化赋值语句的只第一次调用,之后的i就一直会被记录下来。由此可知主函数内的i与f()函数内的i是不可以混淆和混用的。主函数内,当i=0时,进入a 的计算,调用f()函数,然后s=1传递数值出来给a(此时f()函数内的i自增成为了1)。然后再次调用s=2传递出来,以此类推,显然a的结果是大于1的数字。我们用大I表示主函数内的i,小i表示f()函数内的i。》》表示编译过程或者是推出过程
I,a=0 》》判断循环I=0》》i=0》》s=1》》i=1》》a=1
判断循环I=1》》i=1》》s=2》》i=2》》a=3
判断循环I=2》》i=2》》s=3》》i=3》》a=6
判断循环I=3》》i=3》》s=4》》i=4》》a=10
判断循环I=4》》i=4》》s=5》》i=5》》a=15
判断循环I=5无法通过,跳出循环,结束程序,结果为a=15。
【4】选(A)
关于符号优先级和自增的问题……好混乱……概念型的题目
由于括号的优先级最高,所以先编译括号内的内容,执行的时候,由于逗号运算符的作用,逗号运算符其实就是在不断的赋值,但是谁最后赋值,谁就会被记录下来,也就是说最后一个表达式会被传递出去。
z = (x++, y++);这个语句的意思是,取括号内最后一个表示式y++的数值,因此明确了到底谁把数值给Z就好办了。由于自增++放置在Y后面,意思就是说,y你先参与赋值给Z的活动,然后我再给你一分。因此z = (x++, y++)其实就是z = ( y++),也就是z = (y);y=y+1;由于最终结果输出的是Z,显然Z值就是最最初始的Y值,即z=3
【5】选(A)
这个跟进制有关……int i = 010, j =10, a = 0x10;其实分别指的是不同进制,在C语言里面,你的本意把某个数表示成八进制,那怎么表示呢?不可能输个八进制的英文进去吧,那么C语言里面规定,0开头的数字都当作八进制,0x开头的被当作十六进制。可见有时候不要画蛇添足,有时为了赋值好看,总觉得(从十进制来看)018和18元,没什么区别。但是在C语言内,认为只要018说明这个数不一般,如果18就输入18的十进制数字,既然不输入18,而输入018说明,这个数字有其他意义,即八进制。同理0x开头是16进制,什么都不处理的数字就是十进制。那么结果算一算就成了。做个示范,i=010,化成10进制就是,1乘以8的一次方+0乘以8的零次方=8。当然编译器处理的输出的结果都是十进制的。故选A。
【6】选(D)
好吧……混乱的结合性……我查查书……
x+a%3*(int)(x+y)%2/4,这个的关键在于顺序问题,(前提是双目运算下)加减乘除号(包括求余符号)的结合性全是自左向右,那么a%3是相当于整型数据的7求余3,结果为整型1。按顺序继续向右,1去乘以(x+y),注意(x+y)被强制转换了,因为是(int)(x+y)这样的形式,那么x与y的和是7.2,然后强制转换成整型,就是7。那么1乘以7就是7。继续来,剩下的就是7%2/4了,那么按顺序来,7%2结果是1,而1去除以4
的结果是零!而不是0.25。因为除以的定义中有一条,若分子为整型数,即1/4,结果仍为整型,倘若表达式是这样的,1.0/4,那就可以得到小数点后的数了。所以要注意类型区别。也就是说刚刚算了一通,额……结果是零……那么x+a%3*(int)(x+y)%2/4化简成x+0,即输出X。强调一下,输出格式为%g,其意义是输出宽度较短的一种格式,不输出无意义的0. 那么结果是2.5。
【7】选(B)
昨儿说过类似的,C项s = “ABCDE”的表达是错误的,因为s是地址,不可能等于具体的数值,D项SCANF是单个的输入,也就是说,如果想要字符串,只有用循环,即for(i=0;i<5;i++){scanf("%s",s);}
【10】选(D)
当被调函数的函数定义出现在主调函数之前时,在主调函数中可以不对被调函数再作说明而直接调用。如果被调函数的函数定义出现在主调函数之后,需要的是在程序开头对函数声明在前。例如:fun();main(){fun();}fun(){.....} 但是函数说明解释,可以在主函数后面进行程序说明。
【11】选(C)
除选项 c 项外,其它各项都没有按照 c 语言中的函数定义规则定义函数。函数说明一般形式为:函数名(类型 形参,类型 形参…); 或为:函数名(类型,类型…);
【12】选(C)
很显然……SUM没有赋值……这样系统不会默认的……系统会随机选数赋值给SUM
【13】选(C)
在局部变量的定义中, 键字auto. 没有指明存储类别的变量,一律隐含为:自动变量.而 外部变量的隐含类别则是静态存储类别
【14】选(B)
转义字符引导符后加数字,默认是数字为八进制
A) '\084' 默认的八进制中84的8不可能出现,是非法的 B) '\x43' 是字符常量 ,16进制的ASCII对应的符号是大写的C C) 'ab' 字符常量是单个字符的ASCII值,要么一个a,要么一个b D) "\0"是转义字符,是关键符号,不合法的字符常量
【15】选(B)
func((exp1,exp2),(exp3,exp4,exp5));
其实就是func(exp2,exp5);
.......
最小空间当然是单向链表
既然是循环的链表实现的队列
队列当然是FIFO,你第一下要找到的就该是链表头和下一个链表头.
尾指针是指向下一个节点,头指针是上一个节点.
取出第一个节点,要找第二个节点,应该是尾指针标志.
应该是这么理解.....
..........