牛客网刷题记录(1)


文章目录

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

单纯的记录自己刷题后的错误 【牛客网刷题记录(1)】
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

解法:
主要判断 && 的运算方式,只有在左边的值是正确的情况才继续运算。
左边(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)
文章图片

解法:
主要考结构体的计算和偏移。这里是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) { case’1’: printf(“1”); case’2’: printf(“2”); case’3’: printf(“3”); default: printf(“error”); } }

解法:
这是一个坑,这里没有break,所以按照顺序一直打印到最后。
6题 牛客网刷题记录(1)
文章图片
解法:
  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;若不为空,结构体的存储比较复杂,需要考虑内存存储的字节对齐。

    推荐阅读