XiyouLinux兴趣小组2020年纳新面试题

  1. 请试着解释其输出。
int main(int argc , char *argv[]) {
 unsigned char a = 255;
 char ch = 128;
 a -= ch;
 printf("a = %d ch = %d\n", a, ch);
}

结果
在这里插入图片描述

解析:a为无符号其二进制 11111111 减去b :01111111
为1000000 其值为127
所以第一个打印出的数字为127
ch=128 char类型最高只能存127 128的补码等同-128
所以第二个打印的数字为-128

#include <stdio.h>
int main(int argc, char *argv[]) {
  char *str = "Xi You Linux Group 20";
  printf("%d\n", printf(str));
  return 0;
}

结果
在这里插入图片描述
解析:
printf函数返回值为输出的字符个数

#include "stdio.h"

int i = 2;
void func() {
  if (i != 0) {
    static int m = 0;
    int n = 0;
    n++;
    m++;
    printf("m = %d, n = %d\n", m, n);
    i--;
    func();
  } else {
    return;
  }
}
int main(int argc, char *argv[]) {
  func();
  return 0;
}

解析;
本题目考察的是static关键字 对变量的作用
普通局部变量会在函数调用结束释放
但静态局部变量不会
静态局部变量使用static修饰符定义,即使在声明时未赋初值,编译器也会把它初始化为0。且静态局部变量存储于进程的全局数据区,即使函数返回,它的值也会保持不变。

#include <stdio.h>
int main(int argc, char *argv[]) {
  char ch = 'A';
  int i = 65;
  unsigned int f = 33554433;
  *(int *)&f >>= 24;
  *(int *)&f = *(int *)&f + '?';
  printf("ch = %c i = %c f = %c\n", ch, i, *(int *)&f);
  return 0;
}

在这里插入图片描述
解析:
unsigned int f = 33554433; //二进制为10000000000000000000000001
右移24 为10 值为2
2+’?’=65 //?的ASCII值为63

#include<stdio.h>
int main(int argc, char *argv[]) {
  int a[2][2];
  printf("&a = %p\t&a[0] = %p\t&a[0][0] = %p\n", &a, &a[0], &a[0][0]);
  printf("&a+1 = %p\t&a[0]+1 = %p\t&a[0][0]+1= %p\n", &a + 1, &a[0] + 1,
         &a[0][0] + 1);
  return 0;
}

在这里插入图片描述
a代表a[0]的地址
a[0]代表数组a的a[0]的第一个元素a[0][0]的首地址+1等于加一列
&a代表数组a的首地址+1等于加一个数组的长度

#include "stdio.h"
#include"string.h"
int main(int argc, char *argv[]) {
  char str[] = "XiyouLinuxGroup";
  char *p = str;
  char x[] = "XiyouLinuxGroup\t\106F\bamily";
  printf("%zu %zu %zu %zu\n", sizeof(str), sizeof(p), sizeof(x), strlen(x));
  return 0;
}

在这里插入图片描述
16:1个char1字节15个字符+’\0’ =16
8:64位机器 指针8字节
25:24字符+’\0’
24:strlen统计 24字符不加’\0’;

#include <stdio.h>
int add(int *x, int y) { return *x = (*x ^ y) + ((*x & y) << 1); }
int a;
int main(int argc, char *argv[]) {
  int b = 2020;
  if (add(&b, 1) || add(&a, 1)) {
    printf("XiyouLinuxGroup%d\n", b);
    printf("Waiting for y%du!\n", a);
  }
  if (add(&b, 1) && a++) {
    printf("XiyouLinuxGroup%d\n", b);
    printf("Waiting for y%du!\n", a);
  }
  return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值