1. 程式人生 > 其它 >c++ sleep函式_15個基本的C面試問題

c++ sleep函式_15個基本的C面試問題

技術標籤:c++ sleep函式c++什麼時候陣列溢位不能使用clr編譯c檔案 怎麼強制用clr

c1128672324fd176d1bd13b7abc1fbed.png

原文來自網際網路,由長沙DotNET技術社群【笑語】編譯。

原文來自:https://www.toptal.com/c-sharp/top-10-mistakes-that-c-sharp-programmers-make

1、給定一個int陣列,編寫方法以統計所有偶數的值。

有很多方法可以做到這一點,但是最直接的兩種方法是:

123
static long TotalAllEvenNumbers(int[] intArray) {  return intArray.Where(i => i % 2 == 0).Sum(i => (long)i);}

還有就是

123
static long TotalAllEvenNumbers(int[] intArray) {  return (from i in intArray where i % 2 == 0 select (long)i).Sum();}

當然,你還需要注意以下關鍵:

  1. 你是否利用 C#語言特性 一行就解決問題。(即,不是使用包含迴圈,條件語句和累加器的更長篇幅的解決方案)

  2. 你是否考慮過溢位的可能性。例如,諸如

    return intArray.Where(i => i % 2 == 0).Sum()(與函式的返回型別無關)

這可能一個很”明顯”的單行,但這樣溢位的可能性很高。雖然上面的答案中使用的轉換為long的方法並沒有消除這種可能性,但是它使得發生溢位異常的可能性非常小。但請注意,如果你寫答案的時候詢問陣列的預期大小及其成員的大小,則顯然你在做這道題目的時候在考慮此溢位問題,這很棒。

2、下面的程式碼的輸出是什麼?解釋你的答案。

123456789
class Program {  static String location;  static DateTime time;   static void Main() {    Console.WriteLine(location == null ? "location is null" : location);    Console.WriteLine(time == null ? "time is null" : time.ToString());  }}

輸出將是:

12
location is null1/1/0001 12:00:00 AM

下面的簡短程式的輸出是什麼?解釋你的答案。簡短程式的輸出是什麼?解釋你的答案。
儘管兩個變數都未初始化,但是String是引用型別 、DateTime 是值型別。作為值型別,單位化DateTime變數設定為預設值 公元1年晚上12點,而不是null

3、下面語句中 time 和null 的比較是有效還是無效的?

123456
static DateTime time;/* ... */if (time == null){	/* do something */}

有人可能會認為,由於變數永遠不可能為null (它被自動初始化為1月1日的值),所以編譯器在比較某個變數時就會報錯。具體來說,操作符將其運算元強制轉換為不同的允許型別,以便在兩邊都得到一個通用型別,然後可以對其進行比較。這就是為什麼像這樣的東西會給你期望的結果(而不是失敗或意外的行為,因為運算元是不同的型別):

123
double x = 5.0;int y = 5;Console.WriteLine(x == y);  // outputs true

然而,這有時會導致意外的行為,例如DateTime變數和null的比較。在這種情況下,DateTime變數和null文字都可以轉換為可空的。因此,比較這兩個值是合法的,即使結果總是假的。

4、給定circle以下類的例項:

1234567
public sealed class Circle {  private double radius;    public double Calculate(Func op) {    return op(radius);  }}

簡編寫程式碼以計算圓的周長,而無需修改Circle類本身。
首選的答案如下:

1
circle.Calculate(r => 2 * Math.PI * r);

由於我們不能訪問物件的私有半徑欄位,所以我們通過內聯傳遞計算函式,讓物件本身計算周長。

許多c#程式設計師迴避(或不理解)函式值引數。雖然在這種情況下,這個例子有點做作,但其目的是看看申請人是否瞭解如何制定一個呼叫來計算哪個與方法的定義相匹配。

另外,一個有效的(雖然不那麼優雅的)解決方案是從物件中檢索半徑值本身,然後執行計算結果:

12
var radius = circle.Calculate(r => r);var circumference = 2 * Math.PI * radius;

無論哪種方式。我們在這裡主要尋找的是面試者是否熟悉並理解如何呼叫Calculate方法。

5、下面程式的輸出是什麼?解釋你的答案。

12345678910111213
class Program {  private static string result;   static void Main() {    SaySomething();    Console.WriteLine(result);  }   static async Task SaySomething() {    await Task.Delay(5);    result = "Hello world!";    return “Something”;  }

下面
此外,如果我們替換wait task,答案會改變嗎? 比如 thread . sleep (5) ? 為什麼?的簡短

程式的輸出是什麼?解釋你的答案。序的輸出是什麼?解釋你的答案。

回答:

問題第一部分(即帶有的程式碼版本await Task.Delay(5);)的答案是該程式將僅輸出一個空行(而不是 “ Hello world!”)。這是因為呼叫result時仍將未初始化Console.WriteLine。

大多數程式和麵向物件的程式設計師都希望函式return在返回呼叫函式之前從頭到尾執行,或者從語句執行。C#async函式不是這種情況。它們只執行到第一個await語句,然後返回到呼叫方。由await(在此例中為Task.Delay)呼叫的函式是非同步執行的,並且該await語句之後的行直到Task.Delay完成(在5毫秒內)之前都不會發出訊號。但是,在這段時間內,控制權已經返回給呼叫者,該呼叫者Console.WriteLine對尚未初始化的字串執行該語句。

呼叫await Task.Delay(5) 可讓當前執行緒繼續其正在執行的操作,如果已完成(等待任何等待),則將其返回到執行緒池。這是非同步/等待機制的主要好處。它允許CLR使用執行緒池中的更少執行緒來服務更多請求。

非同步程式設計已經變得越來越普遍,因為執行許多活動的網路服務請求或資料庫請求的裝置越來越普遍。C#具有一些出色的程式設計結構,可以極大地簡化非同步方法的程式設計任務,並且意識到它們的程式設計師將產生更好的程式。

關於問題的第二部分,如果將await Task.Delay(5);其替換為Thread.Sleep(5),則程式將輸出Hello world!。一種沒有至少一個語句的async方法,其操作就像同步方法一樣。也就是說,它將從頭到尾執行,或者直到遇到一條語句為止。呼叫只是阻塞了當前正在執行的執行緒,因此呼叫僅將方法的執行時間增加了5毫秒。awaitreturnThread.Sleep()Thread.Sleep(5)SaySomething()

6、下面的程式輸出是什麼?解釋你的答案。

12345678910111213141516
delegate void Printer();static void Main(){        List printers = new List();        int i=0;        for(; i < 10; i++)        {            printers.Add(delegate { Console.WriteLine(i); });        }        foreach (var printer in printers)        {            printer();        }}

這個程式將把數字10輸出十次。

原因如下: 委託被新增到 for迴圈中l了,而 “引用” (或者“指標”)被儲存到i中,而不是值本身。因此,在我們退出迴圈之後,變數i被設定為10,所以到呼叫每個委託時,傳遞給它們的值都是10。

7、是否可以將混合資料型別(例如int,string,float,char)全部儲存在一個數組中?

是! 之所以可以這樣做,是因為陣列的型別object不僅可以儲存任何資料型別,還可以儲存類的物件,如下所示:

1234567891011121314151617181920212223242526272829303132333435
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication8{    class Program    {        class Customer        {            public int ID { get; set; }            public string Name { get; set; }            public override string ToString()            {                return this.Name;            }        }        static void Main(string[] args)        {            object[] array = new object[3];            array[0] = 101;            array[1] = "C#";            Customer c = new Customer();            c.ID = 55;            c.Name = "Manish";            array[2] = c;            foreach (object obj in array)            {                Console.WriteLine(obj);            }            Console.ReadLine();        }    }}

8、比較C#中的結構和類。他們有什麼共同點?它們有何不同?

C#中的類和結構確實有一些共同點,即:

他們都是

是複合資料型別

可以包含方法和事件

可以支援介面

但是有許多差異。比較一下:

類:

支援繼承

是引用(指標)型別

引用可以為空

每個新例項都有記憶體開銷

結構:

不支援繼承

是值型別

按值傳遞(如整數)

不能有空引用(除非使用了Nullable)

每個新例項沒有記憶體開銷(除非“裝箱”)

9、這裡有一個包含一個或多個$符號的字串,例如:

1
"foo bar foo $ bar $ foo bar $ "

問題:如何$從給定的字串中刪除第二和第三次出現的?
答案:

使用如下正則表示式:

1234
string s = "like for example $  you don't have $  network $  access";Regex rgx = new Regex("\\$\\s+");s = Regex.Replace(s, @"(\$\s+.*?)\$\s+", "$1$$");Console.WriteLine("string is: {0}",s);

說明:

  • ($\s+.*?)-第1組,捕獲一個文字$,一個或多個空格字元,然後捕獲除換行符以外的任意數量的字元,並儘可能少地捕獲到下一個最接近的匹配項

  • $\s+—單個$符號和一個或多個空格字元

  • $1引用組1的值,它只是將其插入被替換的字串中,$$代表替換模式中的$符號。

    10、下面的程式輸出是什麼?

    1234567891011121314151617181920212223242526272829303132333435
    public class TestStatic    {        public static int TestValue;        public TestStatic()        {            if (TestValue == 0)            {                TestValue = 5;            }        }        static TestStatic()        {            if (TestValue == 0)            {                TestValue = 10;            }        }        public void Print()        {            if (TestValue == 5)            {                TestValue = 6;            }            Console.WriteLine("TestValue : " + TestValue);        }    } public void Main(string[] args)        {            TestStatic t = new TestStatic();            t.Print();        }

TestValue : 10

在建立該類的任何例項之前,將呼叫該類的靜態建構函式。此處呼叫的靜態建構函式TestValue首先將變數初始化。

11、有沒有一種方法可以修改ClassA、以便您可以在呼叫Main方法時使用引數呼叫建構函式,而無需建立任何其他新例項ClassA?

123456
class ClassA{  public ClassA() { }  public ClassA(int pValue) {  }}

啟動類

1234567
class Program{  static void Main(string[] args)  {    ClassA refA = new ClassA();  }}

回答:

所述this關鍵字被用於呼叫其他構造,初始化該類物件。下面是實現:

12345678
class ClassA{  public ClassA() : this(10)  { }  public ClassA(int pValue)  {  }}

12、以下程式碼輸出什麼?

12345678910111213141516171819202122232425262728293031
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace main1{    class Program    {        static void Main(string[] args)        {            try            {                Console.WriteLine("Hello");            }            catch (ArgumentNullException)            {                Console.WriteLine("A");            }            catch (Exception)            {                Console.WriteLine("B");            }            finally            {                Console.WriteLine("C");            }            Console.ReadKey();        }    }}

答案:

12
HelloC

13、描述依賴注入。

依賴注入是一種使緊密連結的類分離的方式,從而減少了類之間的直接依賴。有多種方法可以實現依賴項注入:

  1. 建構函式依賴

  2. 屬性依賴

  3. 方法依賴

    14、編寫一個C#程式,該程式接受以千米為單位的距離,將其轉換為米,然後顯示結果。

    123456789101112131415161718192021222324
    using system;class abc{    public static Void Main()        {                  int ndistance, nresult;                    Console.WriteLine("Enter the distance in kilometers");                ndistance = convert.ToInt32(Console.ReadLine());                nresult = ndistance * 1000;                  Console.WriteLine("Distance in meters: " + nresult);                Console.ReadLine();            }    }

15、描述裝箱和拆箱。並寫一個例子。

裝箱是將值型別隱式轉換為該型別object或該值型別實現的任何介面型別。將值型別裝箱會建立一個包含該值的物件例項,並將其儲存在堆中。

例:

12345
int x = 101;object o = x;  // boxing value of x into object oo = 999;x = (int)o;    // unboxing value of o into integer x

最後:

面試不僅要基礎紮實,更重要的是能解決棘手的技術問題,所以以上這些內容僅供參考。並非每個值得招聘的優秀候選人都能夠回答所有問題,也不能確定能夠全部回答,就能保證他是一個優秀候選人。歸根結底,招聘仍然是一門藝術,一門科學以及許多工作。

說實話,這十五個問題,部分問題確實比較棘手,一度讓我也思考了好久。你覺得呢?趕緊在你的朋友圈分享起來吧~