C语言--每日选择题--Day31

第一题

1. 下面程序 的值为()

int main()
{
    int i = 10;
    int j = 0;
    if (j = 0)
        i++; 
    else
        i--;        
    return 0;
}

A:11

B:9

答案及解析 B

if语句中的条件判断为赋值语句的时候,因为赋值语句的返回值是右操作数;

比如 if(j = 1) 相当于 if(1),if(j = 0) 相当于if(0)

所以在了解这里之后,就可以得出答案啦

第二题(注意细节)

2. 下面程序的输出结果为()

#include 
void fun(int *s) 
{
    static int j = 0;

    do 
    {
        s[j] += s[j + 1];
    } while (++j < 2);
}
int main() 
{
    int i, a[10] = {1, 2, 3, 4, 5};

    for (i = 1; i < 3; i++)
        fun(a);

    for (i = 1; i < 5; i++)
        printf("%d", a[i]);
    printf("\n");

    return 0;
}

A:34756

B:5745

C:5795

D:35745

答案及解析 B

 本题考查的是局部static变量和do-while循环的认识;

局部static变量,只会初始化一次,因为是存在静态区的,值不会被刷新;

do-while循环,先执行语句,再判断条件

所以我们这里是进入2次fun函数,最后打印的时候是打印下标为1~4的哦,这里要注意;

在fun函数内部:

第一次进入函数:先初始化一下static变量j = 0;之后进入两次do-while循环;j = 2的时候循环结束,函数也结束;

第二次进入函数:不会执行初始化j,虽然j = 2;但是先执行do-while内部的语句,再判断;

最后数组元素分别为:3 5 7 4 5

输出结果为 5 7 4 5;

第三题

3. 下列代码的结果是

#include
int main() 
{ 
    int a[5] = {1, 2, 3, 4, 5}; 
    int *ptr = (int *)(&a + 1); 
    printf("%d,%d", *(a + 1), *(ptr - 1)); 
    return 0;
}

A:3,5

B:2,4

C:2,5

D:3,4

答案及解析 B

本题是考查你对指针和数组的认识,我们来一步一步分析:

数组名代表首元素地址,但是有2个例外:sizeof(数组名),&数组名,数组名都表示整个数组

在了解上面的知识之后:

先看&a,这里表示的取整个数组的地址

对指针的加法,移动的字节数是根据这个指针指向的内容的数据类型算的,数据类型是什么,对指针加的数字就乘这个内容的数据类型的字节数;

&a指向的内容是整个数组,数组的数据类型是int [5]

所以&a+1,是移动的整个数组的大小,也就是1 * (5 * 4)字节,移动的也就是整个数组的大小;

但是这个指针被强制转换为int*类型,也就是指向的内容的数据类型为int,加减就不一样了;

则ptr - 1,就是减小一个int类型,4个字节,而不是整个数组的大小了;

C语言--每日选择题--Day31_第1张图片

第四题

4. 执行下面程序段后, x 的值是( )

int a = 14, b = 15, x;
char c = 'A';
x = (a && b) && (c < 'B');

A:true

B:false

C:0

D:1

答案及解析 

首先我们来看x = (a&&b)&&(c < 'B')

&&是与操作符,是双目操作符,结合性是从左到右;

我们要知道条件判断操作符,真为1,假为0

先算右边的操作数(a&&b)

因为a = 14,b = 15 ;上面就转换为(14 && 15)为真;

所以1 && (c < 'B')

右边c = 'A' ,c < 'B'成立,为真;

最后x = 1 && 1;

所以都为1,为真,x = 1;

第五题

5. while 循环语句的循环体至少执行一次,请问这句话的说法是正确的吗?

A:正确

B:错误

答案及解析 B

只有do-while才会至少执行一次,先执行语句后判断;

你可能感兴趣的:(C语言选择题,c语言,算法,开发语言)