西邮Linux兴趣小组2020面试题

运行下面代码,输出结果是什么?解释其原因。

int i;
int main(int argc,char *argv[]){
    i--;
    if(i>sizeof(i)){
        printf(">\n");
    }else{
        printf("<\n");
    }
    return 0;
}

>

未初始化的全局变量全部默认值为0,而i--后i的值为-1,二进制表示为

1111 1111 1111 1111 1111 1111 1111 1111

而sizeof的结果为4,二进制表示为

0000 0000 0000 0000 0000 0000 0000 0100

显然在比较中将i当作了无符号整型来与sizeof(i)比较的,所以结果为>


执行下面代码段,谈谈你对宏的理解。

#define A 2 + 2
#define B 3 + 3
#define C A *B
int main(int argc, char *argv[])
{
    printf("%d\n", C);
    return 0;
}

11

宏进行的是简单的文本替换,题中A*B的替换结果其实是2+2*3+3


分析下面程序的输出结果

int main(int argc, char *argv[])
{
    char str[] = "Welcome to XiyouLinuxGroup";
    printf("%zu %zu\n", strlen(str), sizeof(str));
    return 0;
}

26 27

%zu输出size_t型,size_t在库中定义为unsigned int 。

strlen计算的是字符串的元素个数(不包括结尾的"\0")

而sizeof计算的是其占内存的大小,结尾"\0"也占一字节,所以结果为27。


 在程序中执行此函数,其输出结果是什么,在同一程序中执行多次该函数,输出结果是否相同?

void fun()
{
    int x = 0;
    static int num = 0;
    for (int i = 0; i < 5; i++)
    {
        x++;
        num++;
    }
    printf("x = %d num = %d\n", x, num);
}

x = 5 num = 5

x = 5 num = 10

x输出结果相同,num的不同。

使用static修饰符定义静态局部变量,它的生命周期是整个应用程序的运行时间,它只会被初始化一次。每次调用fun()都会在num原有的基础上再加5,而x每次都是从0加到5


分析以下程序,推测并验证其作用。

int main(int argc, char *argv[])
{
    int number;
    unsigned mask;
    mask = 1u << 31;
    scanf("%d", &number);
    while (mask)
    {
        printf("%d", (number & mask) ? 1 : 0);
        mask >>= 1;
    }
    return 0;
}

首先,1u的作用是表示1是unsigned int类型的,<<是左移,

如char a=1,a的二进制为0000 0001,执行a<<3后a的值为8,其二进制数为0000 1000,低位补0。

&是且运算,对应二进制位都为1时该位的结果为1,否则为0。

如a=3,b=7,a&b=2(0011 & 1110 = 0010)

同理mask>>=1是向右移动一位,高位补0。

"?:"是双目运算符,?前面的返回值不为零则返回?与:中间的值,否则返回:后面的值


 下面程序的执行结果是什么,请解释说明

int main(int argc, char *argv[])
{
    char *str = "Xiyou Linux Group";
    printf("%c\n", *str + 1);
    return 0;
}

X的地址为该字符串的首地址,则*str='X',而'X'+1='Y'(ASCII码的加减)


 以下程序段运行的结果是什么,你知道怎么判断两个浮点数是否相同?

int main(int argc, char *argv[])
{
    double a = 3.14;
    float b = a;
    if ((float)a == b)
    {
        printf("Xiyou");
    }
    if (a != b)
    {
        printf("LinuxGroup\n");
    }
    return 0;
}

XiyouLinuxGroup

整数在转换成浮点数时精度有损失,float只能保证最少6位数字有效,而double只能保证最少15位数字有效。所以a!=b。当a强制转换为float时,a==b。


 运行下列代码,解释运行结果,谈谈自己的理解。

int main(int argc, char *argv[])
{
    int a[6] = {0x6f796958, 0x694c2075, 0x2078756e, 0x756f7247, 0x30322070,
                0};
    printf("%d\n", printf("%s", (char *)a));
    return 0;
}

家用计算机一般都为小端机,即低位在前。例如题中:0x6f796958  在计算机中“58”在前,“69”在后。先输出十六进制数“58”所对应的字符,后输出十六进制数“69”所对应的字符。


分析下列程序的输出,解释其原因

int main(int argc, char *argv[])
{
    int a[2][3] = {{5, 7}, {5, 2}};
    int b[2][3] = {5, 7, 5, 2};
    int c[2][2] = {{5, 7}, {5, 2}};
    int d[2][2] = {5, 7, 5};
    printf("%d %d\n", a[1][1], b[1][1]);
    printf("%d %d\n", c[1][1], d[1][1]);
    return 0;
}

2  0

2  0

int a[2][3] = {{5, 7}, {5, 2}};//相当于:{{5,7,0},{5,2,0}}
int b[2][3] = {5, 7, 5, 2};//按顺序初始化,相当于{{5,7,5},{2,0,0}}
int c[2][2] = {{5, 7}, {5, 2}};
int d[2][2] = {5, 7, 5};//同b


 执行下面程序段,其输出结果是什么,解释其原因。

int main(int argc, char *argv[])
{
    int a = 1;
    printf("%d\n", *(char *)&a);
}

1

*(char *)&a是将a的指针改为char类型指针,再取值运算后a实际的值并未变化。


 下面程序段的输出结果是什么,若取消第三行的const注释,数组a还能被修改吗?取消6,8行的注释,程序还能正常运行吗?解释其原因

int main(int argc, char *argv[])
{
    /*const*/ char a[] = "XiyouLinux\0";
    char *b = "XiyouLinux\0";
    a[5] = '\0';
    // b[5] = '\0';
    printf("%s\n", a);
    // printf("%s\n",b);
    return 0;
}

1)不能被修改

2)不能正常运行

const修饰的数组,其中任何元素都不能被改变。

不能通过指针对数组b进行赋值


 一个c源文件到一个可执行文件的过程中经历了那些步骤?

1、预处理

在预处理阶段,编译器主要作加载头文件、宏替换、条件编译的作用。一般处理带“#”的语句。

2、编译

在编译过程中,编译器主要作语法检查和词法分析。我们可以通过使用 -S 选项来进行查看,该选项预处理之后的结果翻译成汇编代码。

3、汇编

在汇编过程中,编译器把汇编代码转化为机器代码。

4、链接

链接就是将目标文件、启动代码、库文件链接成可执行文件的过程,这个文件可被加载或拷贝到存储器执行。


你可以看出这个函数的功能吗?尝试理解原理并优化

void sort(int arr[], int size)
{
    int i, j, tmp;
    for (i = 0; i < size - 1; i++)
    {
        for (j = 0; j < size - i - 1; j++)
        {
            if (arr[j] > arr[j + 1])
            {
                tmp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = tmp;
            }
        }
    }
}

冒泡排序,依次比较数组内相邻两数,按升序或降序交换两数。

优化:

void sort(int arr[], int size)
{
    int flag = 1;
    int count = 0;
    int i,j,temp;
    for(i=0;i<size-1&&flag;i++) 
    {
        for(j=0;j<size-1;j++) 
        {
            flag = 0;
            count++;
            if(arr[j]>arr[j+1])
            {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
                flag = 1;
            }
        }
    }
}


 西邮Linux兴趣小组2020面试题

pwd (显示目前所在的目录) 

ls : 列出目录及文件名,-a 全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来

mkdir(创建新目录):

mkdir [-mp] 目录名称

cp 即拷贝文件和目录。

[root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination)

上一篇:关于Spring中的配置(开启注解)


下一篇:Linux下目录编程(读取、创建、拷贝)