1.下面代碼段將列印出多少個‘=’?運用相關知識解釋該輸出,
int main(int argc, char *argv[])
{
for (unsigned int i = 3; i >= 0; i--)
putchar('=');
}
運行結果:
死回圈
分析:i是無符號整型變數,不可能變為負值,所以會死回圈,
2.下列三種交換整數的方式是如何實作交換的?
/* (1) */ int c = a;
a = b ;
b = c;
/* (2) */
a = a - b;
b = b + a;
a = b - a;
/* (3) */
a ^= b ;
b ^= a ;
a ^= b;
第一個是通過中間變數,暫時儲存一個數的值,來達到交換數值的目的的,
第二個是通過演算法,通過計算將a和b的值轉化成一個算數式子儲存,以便交換,(數學)
第三種是通過異或的原理,相同的兩個值異或為零,任何數與零異或值不變,
3.有如下代碼段所示的函式 f,當我們執行該函式時,會產生什么樣的輸出結果?在同一程式中 多次執行該函式,輸出結果是否一致?
void f()
{
static int a = 0;
int b = 0;
printf("%d, %d\n", ++a, ++b);
}
執行結果:1 1
多次執行該結果是會變的,a是用static開辟的一個靜態變數,是存在靜態區的,函式執行結束后a所屬的空間是不會被銷毀的,
4.下面程式段的輸出是什么?請解釋該現象并說出與之相關盡可能多的知識,
int main(void) {
printf("%d\n", printf("Xiyou Linux Group2%d", printf("")));
}
結果:Xiyou Linux Group2019
printf函式的回傳值是寫入的字符總數,此處寫入了19個字符,
5.執行下面的代碼段,會輸出什么?請試著解釋其原因,并敘述相關知識,
int main(int argc, char *argv[])
{
char ch = 255;
int d = 'a' + 1;
printf("%d %d", ch, d);
}
輸出結果:-1 98
這道題考的是ascii碼,ascii一般是127位,255是拓展出來的,
對于255:二進制是0000 0000 1111 1111,但char型別只有一個位元組,所以他是以1111 1111存到記憶體中的,再以整型的方式往出來取時,會進行整形提升 ,1111 1111 1111 1111,然后轉化為原碼就是1000 0000 0000 0001,所以輸出會是-1;.
對于d:a的ascii碼為97,“+1”后就是98.
6.執行以下代碼段,將產生什么樣的輸出?請對輸出加以解釋,并手動計算代碼中 t 的值,
int main(int argc, char *argv[])
{
char x = -2, y = 3;
char t = (++x) | (y++);
printf("x = %d, y = %d, t = %d\n", x, y, t);
t = (++x) || (y++);
printf("x = %d, y = %d, t = %d\n", x, y, t);
}
執行結果:
x = -1, y = 4, t = -1
x = 0, y = 5, t = 1
-1|3
1111 1111 1111 1110
0000 0000 0000 0001
1111 1111 1111 1111——補碼
1111 1111 1111 1110——反碼
1000 0000 0000 0001——原碼
所以是-1;
7.下面代碼段的輸出結果是什么?輸出該結果的原因是?
#define X a+b
int main(int argc, char *argv[])
{
int a = 1, b = 1;
printf("%d\n", X*X);
}
輸出結果:3
宏只是單純的替換,不涉及運算子a+b*a+b
8.請解釋下面代碼段中每一句的效果,
int val = 2018;
int *pi = 2019;
pi = &val;
*pi = 0;
第一句為給int型別變數val賦值,
第二句是給int型別指標變數pi賦值(這里是給int*型別賦值int型別,所以pi儲存的的地址為2019),
第三句是將val的地址賦給pi,
第四句是通過地址找到val,將val修改為0
9.執行下列程式段,并輸入“Xiyou Linux”(不含引號),那么程式的輸出結果是什么?請解釋 其原因,
int main(int argc, char *argv[])
{
char *p = (char *)malloc(sizeof(char) * 20),
*q = p;
scanf("%s %s", p, q);
printf("%s %s\n", p, q);
}
輸出結果:Linux Linux
q指向的是p的地址,此程序相當于先將Xiyou給p,然后再通過地址找到p,將其修改為Linux
10.執行下面的程式段,每次執行的輸出結果一致嗎,整理并解釋輸出結果,
int main(int argc, char *argv[]) {
int a[4] = { 2, 0, 1, 9 };
printf("%p, %p\n", a, &a);
printf("%p, %p\n", a + 1, &a + 1);
}
輸出結果:0x7fffffffdb90, 0x7fffffffdb90
0x7fffffffdb94, 0x7fffffffdba0
分析:&a和a,一個表示整個陣列的地址,一個表示首元素地址,
每次執行的結果是不一樣的
11.斐波那契數列是這樣的一串數列:1,1,2,3,5,8,13,......,在這串數列中,第一項、第二項為 1,其他項為前兩項之和,該數列的第 x 項可以表示為下面的函式,請根據描述,寫出一個程式,使之輸入 x 后,能夠輸出斐波那契數列的第 x 項(其中 x<30),當你完成之后,你可以嘗試使用遞回解決這個問題,
#include<stdio.h>
int f(int n)
{
if (n <= 2)
return 1;//當n=1,2時回傳值為1,即f(0)=f(1)=f(2)=1
else
return f(n - 1) + f(n - 2);//此時n>2,回傳前兩個數之和
}
int main()
{
int n = 0;
scanf("%d", &n);
printf("%d\n", f(n));
return 0;
}
12.下面代碼段是某一種排序演算法的簡單實作,你知道它是什么嗎?請講解其原理,并嘗試改進它,
int main(int argc, char *argv[])
{
int nums[6] = {6, 3, 2, 4, 5, 1};
for (int i = 0; i < 6; i++)
{
for (int j = i; j < 6; j++)
{
if (nums[i] > nums[j])
{
int c = nums[i];
nums[i] = nums[j];
nums[j] = c;
}
}
}
}
這是選擇排序
優化思路:每次找出最小之值和最大值的下標,一次回圈結束后再進行交換
int main(){
int len=sizeof(a)/sizeof(int);
int t;
/*初始化左端、右端元素下標*/
int left = 0;
int right = len - 1;
while (left < right){
/*初始化最小值、最大值元素的下標*/
int min = left;
int max = right;
for (int i = left; i <= right; i++){
/*標記每趟比較中最大值和最小值的元素對應的下標min、max*/
if (a[i] < a[min])
min = i;
if (a[i] > a[max])
max = i;
}
/*最大值放在最右端*/
int t = a[max];
a[max] = a[right];
a[right] = t;
/*此處是先排最大值的位置,所以得考慮最小值(a[min])在最大位置(right)的情況*/
if (min == right)
min = max;
/*最小值放在最左端*/
t = a[min];
a[min] = a[left];
a[left] = t;
/*每趟遍歷,元素總個數減少2,左右端各減少1,left和right索引分別向內移動1*/
left++;
right--;
}
}
13.請簡單敘述兩種位元組序(大端、小端)的概念,你的機器是什么位元組序?試著寫一個 C 語言程式來驗證,
大端存盤模式:是指資料的低位位元組序保存在記憶體的高地址中,而資料的高位位元組序保存在記憶體的低地址中(高位在前)
小端存盤模式:是指資料的低位位元組序保存在記憶體的低地址中,而資料的高位位元組序保存在記憶體的高地址中(低位在前)
#include<stdio.h>
int Check()
{
int i = 1;
return (*((char*)&i));
//回傳1表示小端
//回傳0表示大端
}
int main()
{
int c = Check();
if (1 == c)
{
printf("小端\n");
}
else
{
printf("小端\n");
}
return 0;
}
14.以下是在某機器下執行 Linux 命令 ls 的部分輸出(有刪節),參考該輸出,你可以說出哪些關于該命令以及其他 Linux的相關知識?
[root@xiyoulinux /]# ls -al
total 36
drwxr-xr-x 17 root root 4096 Sep 21 23:45 .
drwxr-xr-x 17 root root 4096 Sep 21 23:45 ..
lrwxrwxrwx 1 root root 7 Aug 21 22:21 bin -> usr/bin
drwxr-xr-x 4 root root 2048 Jan 1 1970 boot
drwxr-xr-x 21 root root 3580 Nov 21 21:16 dev
drwxr-xr-x 83 root root 4096 Nov 21 22:12 etc
drwxr-xr-x 4 root root 4096 Sep 22 00:07 home
drwxr-xr-x 2 root root 4096 Aug 21 22:21 mnt
drwxr-x--- 9 root root 4096 Nov 19 19:15 root
dr-xr-xr-x 13 root root 0 Nov 21 21:15 sys
drwxrwxrwt 10 root root 380 Nov 21 22:30 tmp
drwxr-xr-x 9 root root 4096 Nov 21 22:12 usr
該命令顯示出指定目錄下的內容(包括當前目錄中檔案及其子目錄),
-al 指查看設備是否具有讀寫權限,
第一串列示檔案型別及權限
第二串列示鏈接數
第三串列示該檔案所有者
第四串列示該檔案所屬群組
第五串列示檔案大小(位元組)
后面三列是該檔案的最后修改時間
最后一列是檔案名稱
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/384523.html
標籤:其他
上一篇:多重背包 +優化
下一篇:上機實驗7 運算子多載
