牛客网刷题记录(1)

文章目录

  • 1题
  • 2题
  • 3题
  • 4题
  • 5题
  • 6题
  • 7题
  • 8题
  • 9题
  • 10题

单纯的记录自己刷题后的错误

1题

以下程序的k最终值是:
int i = 10;
int j = 20;
int k = 3;
k *= i + j;

解法:
考虑优先级,+的优先级高于 *= ;
计算为 k = k * (i + j); 答案是90

2题

这个程序的结果是:

int main()
{
    int a=1,b=2,m=0,n=0,k;
    
    k=(n=b<a)&&(m=a) ;
    printf("%d,%d\n",k,m);
    
    return 0;
}

解法:
主要判断 && 的运算方式,只有在左边的值是正确的情况才继续运算。
左边(n = b < a)是一个错误的,返回值为0,右边不再执行也为0.
所以答案是: 0 , 0

3题

在64位系统以及64位编译器下,以下描述正确的是

struct T {
    char a;
    int *d;
    int b;
    int c:16;
    double e;
};
T *p;

牛客网刷题记录(1)_第1张图片
解法:
主要考结构体的计算和偏移。这里是64位系统,所以int *d;占用8个字节,所以整题结构的大小应该是 (1+7)+8+4+(1+3)+7 = 32

4题

若有说明:int a[][3]={1,2,3,4,5,6,7};则 a 数组第一维的大小是()。

解法:
定义二维数组时,若第一维不确定第二维确定,则数组必须初始化;初始化后数组中元素个数除以第二维大小加上1得到第一维大小;若第一二维全部确定,可以不初始化,默认元素全部为0;不允许第二维不定.
所以这里定以后的数组是: int a[][3] = {1,2,3}{4,5,6}{7,0,0}

5题

void main()
{
    char c;
    scanf(%c”,&c);
    switch(c)
    {
        case1:
        printf(1);
        case2:
        printf(2);
        case3:
        printf(3);
        default:
        printf(“error”);
    }
}

解法:
这是一个坑,这里没有break,所以按照顺序一直打印到最后。

6题

牛客网刷题记录(1)_第2张图片解法:

  1. 预处理命令行可以出现在源程序的任何位置上,因此选项A的说法是错误的。
  2. 源程序的一行上只能出现一条预处理命令,因此选项B的说法也是错误的。
  3. 宏名只要是符合要求的标识符都可以,没有规定一定要大写,因此选项C的说法也是错误的。
  4. 宏替换在程序编译时,就由编译程序对出现的宏名进行了相应的宏替换,因此宏替换不占用程序的运行时间。选项D的说法是正确的。

7题

在 32 位编译器上,设有定义
char *str1 = “Hello”, str2[] = “Hello”; ,
则以下语句 printf("%d %d", sizeof(str1), sizeof(str2)); 的输出结果是()
解法:
*str1是指针,占用4字节(32位)
最后有一个’\0’占位符,所以是6字节

8题

参加位运算的数据其类型不能是()。
解法:
按位运算是对字节或字中的实际位进行检测、设置或移位, 它只适用于字符型和整数型变量以及它们的变体, 对其它数据类型不适用。

9题

fun(int a, int b, int c)
{ c = a * b; }
int main(void)
{  int c;
fun(2, 3, c);
printf(%d\n”, c);
return 0;
}

解答:
这也是坑,函数fun()的参数为值传递,在函数体内的操作不能对传入的值进行修改,所以无法确定 。正确的方法应该是将C改为一个指针或者地址,通过指针和地址进行值传递。

10题

struct T {},sizeof(struct T)的值为
解答:
若结构体为空,其大小为1;若不为空,结构体的存储比较复杂,需要考虑内存存储的字节对齐。

你可能感兴趣的:(C语言学习)