校招筆試 | C語言筆試必考系列!!!

說到C語言,可能有人以爲太簡單了c++

這有啥好說的數組

但素,,,,函數

今天小姐姐就遇到了一個這樣的事
圖片描述spa

因此說C語言裏面坑仍是不少的.net

今天就給你們準備了幾個筆試經典的題目code

能夠助你們順利經過筆試blog

1. 如下敘述中不正確的是(D)
A.在不一樣的函數中可使用相同名字的變量
B.函數中的形式參數是在棧中保存
C.在一個函數內定義的變量只在本函數範圍內有效
D.在一個函數內複合語句中定義的變量在本函數範圍內有效
(複合語句值函數中的成對括號構成)
注:D項是有錯誤的好比我舉個例子圖片

#include<stdio.h>
int man()
{
    {
      int a=10;
    }
    printf("%d\n",a);
    return 0;
}

這個若是再編譯中,必定會出現,a未定義的錯誤的。get

2.博客

#include<stdio.h>
#include<Windows.h>
 
int main()
{
  int i;
  char acNEW[20];
  for (i = 0; i < 5; i++)
  {
    acNEW[i] = '0';
  }
  printf("%d\n", strlen(acNEW));
  system("pause");
  return 0;
}

問題是求輸出結果
這個答案應該不肯定,由於它在爲字符數組賦值時,並未賦 '0' ,可是strlen函數認爲結束的標準就是 '0' ,因此當它讀到最後一位他會繼續走下去,直到它遇到 '0'。
由於後面是垃圾數據都是隨機的,因此strlen函數在讀時直到遇到 '0' 它纔會停下來,因此答案是不肯定的。

3.全局變量能夠定義在被多個.c文件包含着的頭文件中?
錯誤
這個在編譯時會報錯的,可是若是使用static修飾就能夠編譯經過。

4.在X86下,有這些程序:

include<stdio.h>
include<Windows.h>
int main()
{
  union
  {
    short k;
    char i[2];
  }*s,a;
  s = &a;
  s->i[0] = 0x39;
  s->i[1] = 0x38;
  printf("%x\n", a.k);
  system("pause");
  return 0;
}
}
​


這道題問的是輸出的什麼?這裏牽扯的知識點 聯合體和大小端存儲,x86是小端存儲,這種東西就得靠記了。。沒辦法你們都知道聯合體空間公用對吧,short長度爲2B,char i[2]長度也爲2B.因此你的a.k雖然並未賦值,可是你等於輸出了char i[2]數組中的內容,他們雖然名字不一樣如今他們內容是同樣的。這就考驗咱們大小端的概念了。

接下來下面是我畫的這道題的理解圖:

圖片描述

你們也知道讀取數據通常是從高位開始讀,好比一個數字 120 咱們確定是先看他最大的位對吧(高位),因此這道題的答案是 3839

我再截圖驗證一下:

圖片描述

5.求下列程序輸出結果

#include<stdio.h>
#include<Windows.h>
 
int main()
{
  unsigned char a = 200;
  unsigned char b = 100;
  unsigned char c = 0;
  c = a + b;
  printf("%d %d", a + b, c);
  system("pause");
  return 0;
}

這道題主要考的是你對unsigned的理解,接下來我畫一張圖幫你們理解
圖片描述

如今我說的對不對呢?你們看看輸出結果
圖片描述

6.在x86,vc++ 6.0環境下,有下列程序

#include<stdio.h>
#include<Windows.h>
 
int main()
{
  char c;
  unsigned char uc;
  unsigned short us;
  c = 128;
  uc = 128;
  us = c + uc;
  printf("0x%x\n", us);
  us = (unsigned char)c + uc;
  printf("0x%x\n", us);
  us = c + (char)uc;
  printf("0x%x\n", us);
  system("pause");
  return 0;
}

作這道題前應該知道 char 的取值範圍是-128 ~ 127,因此當你給uc賦128的時候,它真實的值爲-128。
圖片描述

具體我說的對不對?看看運行結果。
圖片描述

7.

#include<stdio.h>
#include<Windows.h>
struct tagAAA
{
 
  unsigned char ucld : 1;
  unsigned char ucpara : 2;
  unsigned char ucState : 6;
  unsigned char ucTail : 4;
  unsigned char ucAvail;
  unsigned char ucTail2;
  unsigned char ucData;
}AAA_S1;
struct tagAAA2
{
 
  unsigned int ucld : 1;
  unsigned int ucpara : 2;
  unsigned int ucState : 6;
  unsigned int ucTail : 4;
  unsigned int ucAvail;
  unsigned int ucTail2;
  unsigned int ucData;
}AAA_S2;
int main()
{
  printf("%d  %d\n", sizeof(AAA_S1), sizeof(AAA_S2));
  system("pause");
  return 0;
}
​

求AAA_S再分別爲1字節對齊和四字節對齊的狀況下,佔用空間的大小:?

答案爲 6 16.

這個問題就是位域的問題,我有專門關於結構體對齊的博客,點擊這個連接就能看https://blog.csdn.net/Dawn_sf...

8.

#include<stdio.h>
#include<Windows.h>
#pragma pack(4);
int main()
{
  unsigned char puc[4];
  struct sagPIM{
    unsigned char ucpim1;
    unsigned char ucDate:1;
    unsigned char ucDate1:2;
    unsigned char ucDate2:3;
    }*pstPimData;
  pstPimData = (struct sagPIM*)puc;
  memset(puc, 0, 4);
  pstPimData->ucpim1 = 2;
  pstPimData->ucDate = 3;
  pstPimData->ucDate1 = 4;
  pstPimData->ucDate2 = 5;
  printf("%02x  %02x  %02x  %02x\n", puc[0], puc[1], puc[2], puc[3]);
  system("pause");
  return 0;
}
​



這個主要仍是位域,還有存儲的一些關係了。

由於按照位域存儲,該結構體只須要2個字節便可存儲所有內容,而後開始思考他內部的結構。

下來我畫一個圖理解一下。

圖片描述

再看看運行的結果吧 有圖有真相。

圖片描述

這些題目都是歷年筆試的必考題,你們必定要仔細看看這裏面涉及的知識點呀,這樣筆試的時候才能過過過呀~~

相關文章
相關標籤/搜索