18题就是B 啊,你觉得其他三个答案里面,哪个是对的呢?
15题先做的do{k++;},再判断while(a>d++);,而且这个判断,应当是先判断while(a>d),再做d++。所以k++做完第6次以后(即k=6),判断语句不成立,程序中断。
30题我觉得应当是D啊。如果是C的话,把a[0][0]位于数组第一个位置代进去,得a[0][0]的位置L=0*m+0-1=-1,怎么看也不对嘛。
如果有什么不同意见可以和我讨论
T15: B:
a = 10, d = 5, k = 0; do{k++} while(a>d++)
do while循环特点:先做后判断,也就是先执行k++,
当++置于数的后面,则表明:先赋值(或使用)再自加1,
eg:int x = 1, y; y = x++;
y = x++执行过程:x的值先赋给y,再自加1
所以执行结果:x = 2; y = 1;
再看本题:
第一次循环:k++ => k = 1;
a > d++ : ++是后置的,所以d先与a比较,即10 > 5, 比较结果 为真,会进行第二次循环,而d = 6;
第二次循环:k = 2; 10 > 6 ; d = 7 ;条件10 > 6判断为真,继续循环
……
第五次循环:k = 5; 10 > 9 ; d = 10 ;条件10 > 9判断为真,继续循环
第六次循环:k = 6; 10 > 10 ; d = 11;条件10 > 10判断为假,结束循环
所以最后k的值为6;
T18:C, a[x][y]: x<3,y<4,否则越界
T30: B, 二维数组在内存中的存储是连续的,从一个元素即a[0][0],a[0][1],……,a[0][m-1],a[1][0]……a[1][m-1],a[2][0]……一直下去;a[0][0]的位置:0; a[0][1]的位置:1;……;a[1][0]的位置:m(因为一行有m个);…… ;a[i][j]的位置:前面有i行,i*m;a[i][j]处于当前行的第j+1个,所以i*m+j+1,但是开始位置为0 不是 1 ,所以i*m+j+1-1 = i*m+j;