主頁 > 後端開發 > 歷史為什么選擇C語言?事實證明:暮年的C語言,依舊寶刀未老!

歷史為什么選擇C語言?事實證明:暮年的C語言,依舊寶刀未老!

2021-01-10 06:05:50 後端開發

任何一種新事物的出現都不是來自于偶然,而是時代所驅使的必然結果,


 

一、C語言的發展

1、 C語言有多偉大

如果你問我:C語言有多偉大,那么,我可能會想一下,說:多偉大我不知道,但是我知道很偉大,


 

這里,我想說一句可能有點片面的話,就是:如今這世界上,凡是帶電的地方,可能都會有她(C語言)或者她的子孫的影子,

任何比C語言更低級的語言,都不足以完整地抽象一個計算機系統;任何比C高級的語言,都可以用C來實作,

2、C語言之父


 

丹尼斯·麥卡利斯泰爾·里奇(英語:Dennis MacAlistair Ritchie,1941年9月9日-2011年10月12日),美國計算機科學家,黑客圈子通常稱他為“dmr”,他是C語言的創造者、Unix作業系統的關鍵開發者,對計算機領域產生了深遠影響,并與肯·湯普遜同為1983年圖靈獎得主,


 

丹尼斯.里奇 生平時間線

麻省理工大學計算機系的馬丁教授評價說:"如果說,喬布斯是可視化產品中的國王,那么里奇就是不可見王國中的君主,喬布斯的貢獻在于,他如此了解用戶的需求和渴求,以至于創造出了讓當代人樂不思蜀的科技產品,然而,卻是里奇先生為這些產品提供了最核心的部件,人們看不到這些部件,卻每天都在使用著,"克尼漢評價道:牛頓說他是站在巨人的肩膀上,如今,我們都站在里奇的肩膀上,

3、C語言的先輩

為了簡潔起見,我(Dennis M.Ritchie)省略了對C本身,其父級B [Johnson 73]和其祖父母BCPL [Richards 79]的完整描述,而只關注每種語言的特征元素以及它們如何演變,This paper is about the development of the C programming language, the influences on it, and the conditions under which it was created. For the sake of brevity, I omit full descriptions of C itself, its parent B [Johnson 73] and its grandparent BCPL [Richards 79], and instead concentrate on characteristic elements of each language and how they evolved.

這段文字出自C語言之父丹尼斯.M.里奇所寫的一篇關于《C語言發展史》的文章,文中明確指出C語言源自于B、BCPL兩種語言,可以把C語言看做是站在巨人的肩上,順應時代潮流的后浪,

1)BCPL語言之父


Martin Richards

馬丁·理察德(英語:Martin Richards,1940年7月21日-),生于英國,計算機科學家,為BCPL編程語言的發明者,發展了TRIPOS作業系統,

1966年,馬丁·理察德在劍橋大學,以CPL編程語言為基礎,發明了BCPL編程語言,

2)B語言之父


Kenneth Lane Thompson

肯尼斯·藍·湯普遜(英語:Kenneth Lane Thompson,1943年2月4日-)小名肯·湯普遜(英語:Ken Thompson),美國計算機科學學者和工程師,黑客文化圈子通常稱他為“ken”,在貝爾實驗室作業期間,湯普遜設計和實作了Unix作業系統,他創造了B語言(基于BCPL) — C語言的前身,而且他是Plan 9作業系統的創造者和開發者之一,與丹尼斯·里奇同為1983年圖靈獎得主,

2006年,湯普遜進入Google公司作業,與他人共同設計了Go語言,

3) 一組Ken與Dennis的照片

日益精進 ,站在巨人的肩上


坐著的是Ken 站著的是Dennis

言傳身教

感謝丹尼斯.里奇留給了這世界一本“C語言圣經”

可惜的是,當年筆者大學學的是譚浩強譚老師的C語言 


Dennis與《The C Programming Language》

4 、C語言時間線


 

從圖中時間線,可以明顯的看出C語言的起源以及時間節點,

有時候不得不說時勢造英雄,在1969~1971年之間著名的作業系統Unix從肯.湯普遜手中誕生,作為一種大型的系統性軟體來說,極其需要一種可靠的高級語言的出現(當時的低級語言指的是匯編,因為之前的作業系統是用匯撰寫的),這個時候的丹尼斯.里奇也沒閑著,在對B語言改良之后,就誕生了帶有型別的C語言(據里奇自己說,有一段時間稱這種改良的語言為NB,即:new B,不過,在我們這些吃瓜群眾眼中看來也確實NB),

In 1971 I began to extend the B language by adding a character type and also rewrote its compiler to generate PDP-11 machine instructions instead of threaded code. Thus the transition from B to C was contemporaneous with the creation of a compiler capable of producing programs fast and small enough to compete with assembly language. I called the slightly-extended language NB, for `new B.'

5 、unix時間線


 

Unix的誕生與C語言被廣泛的傳播、使用,有著密切的聯系,

上圖時間線只顯示前幾個與C語言在相同時間段內誕生的Unix版本(當然,感興趣的話,可以查詢Unix相關發展史,絕對會讓你大吃一驚,其中最著名的幾個分支:BSD、minix、Linux...),

下面,通過在網上找得到的部分Unix內核原始碼,來追溯一下C語言出現的時機,

1) PDP-Unix

PDP-Unix系統內核代碼檔案


PDP-7 Unix 

 

可以看到基本都是用匯撰寫的(檔案名后綴.s),為什么用基本這個詞呢?因為,在系統里面有一部分命令是用B語言寫的,

2)First Edition Unix

First Edition Unix系統內核代碼檔案


 

可以看到,還是用匯撰寫的(檔案名后綴.s),

3) Second Edition Unix

Second Edition Unix系統內核代碼檔案


 

Second Edition Unix The second edition of Unix was developed for the PDP-11 at Bell Labs by Ken Thompson, Dennis Ritchie and others. It extended the First Edition with more system calls and more commands. This edition also saw the beginning of the C language, which was used to write some of the commands.

到這個版本,已經可以看到C語言的身影了,

4) Unix與C語言

從C語言在Unix V2版本出現之后,Unix的V3版本開始,已經可以在Unix內核中見到大量C語言撰寫的代碼,

據里奇所說:到1973年初,現代C的基本知識已經完成,C語言和編譯器強大到,足以讓我們在當年夏天用C重寫PDP-11的Unix內核 (也就是Unix的V3版本),

By early 1973, the essentials of modern C were complete. The language and compiler were strong enough to permit us to rewrite the Unix kernel for the PDP-11 in C during the summer of that year.

到了這個時間節點,基本可以肯定的是C語言、Unix的大部分核心都已經完善,剩下要做的就是,可移植性、標準化,

后面的故事,大家可能也聽說過:后來學術和政府組織中都在使用Unix,也正是由于Unix的風靡與興盛,帶動了C語言被廣泛的傳播、使用,

在1980年代,C語言的使用廣泛傳播,并且幾乎所有機器體系結構和作業系統都可以使用編譯器,尤其是,它已成為個人計算機的編程工具,無論是用于這些機器的商業軟體制造商,還是對編程感興趣的最終用戶,都非常受歡迎,

During the 1980s the use of the C language spread widely, and compilers became available on nearly every machine architecture and operating system; in particular it became popular as a programming tool for personal computers, both for manufacturers of commercial software for these machines, and for end-users interested in programming.

這也就是所謂的互相成就,

一句話概括就是:不畏得失、日漸精進,最侄訓相成就,

6 、第一個C語言編譯器是怎樣撰寫的?

不知道你有沒有想過,大家都用C語言或基于C語言的語言來寫編譯器,那么世界上第一個C語言編譯器又是怎么撰寫的呢?這不是一個“雞和蛋”的問題……

回顧一下C語言歷史:Tomphson在BCPL的基礎上開發了B語言,Ritchie又在B語言的基礎上成功開發出了現在的C語言,在C語言被用作系統編程語言之前,Tomphson也用過B語言撰寫過作業系統,可見在C語言實作以前,B語言已經可以投入實用了,因此第一個C語言編譯器的原型完全可能是用B語言或者混合B語言與PDP匯編語言撰寫的,

我們現在都知道,B語言的執行效率比較低,但是如果全部用匯編語言來撰寫,不僅開發周期長、維護難度大,更可怕的是失去了高級程式設計語言必需的移植性,

所以早期的C語言編譯器就采取了一個取巧的辦法:先用匯編語言撰寫一個C語言的一個子集的編譯器,再通過這個子集去遞推,進而完成完整的C語言編譯器,

詳細的程序如下:先創造一個只有C語言最基本功能的子集,記作C0語言,C0語言已經足夠簡單了,可以直接用匯編語言撰寫出C0的編譯器,依靠C0已有的功能,設計比C0復雜,但仍然不完整的C語言的又一個子集C1語言,其中C0屬于C1,C1屬于C,用C0開發出C1語言的編譯器,在C1的基礎上設計C語言的又一個子集C2語言,C2語言比C1復雜,但是仍然不是完整的C語言,開發出C2語言的編譯器 …… 如此直到CN,CN已經足夠強大了,這時候就足夠開發出完整的C語言編譯器的實作了,至于這里的N是多少,這取決于你的目標語言(這里是C語言)的復雜程度和程式員的編程能力,簡單地說,如果到了某個子集階段,可以很方便地利用現有功能實作C語言時,那么你就找到N了,下面的圖說明了這個抽象程序:


 

https://kknews.cc/tech/bx2r3j.html 介紹一個概念,“自編譯”Self-Compile,也就是對于某些具有明顯自舉性質的強型別(所謂強型別就是程式中的每個變數必須宣告型別后才能使用,比如C語言,相反有些腳本語言則根本沒有型別這一說法)編程語言,可以借助它們的一個有限小子集,通過有限次數的遞推來實作對它們自身的表述,這樣的語言有C、Pascal、Ada等等,至于為什么可以自編譯,可以參見清華大學出版社的《編譯原理》,書中實作了一個Pascal的子集的編譯器,https://zhuanlan.zhihu.com/p/136102461

而這個程序也在Unix V2版本中找到了證據,


 

肯恩·湯普森,丹尼斯·里奇和其他人在貝爾實驗室為PDP-11開發了Unix的第二版,它通過更多的系統呼叫和更多的命令擴展了第一版,此版本還看到了C語言的開始,該語言用于撰寫一些命令,

此處的代碼僅是某些命令,某些庫函式和C編譯器的源代碼,c /中的檔案來自 last1120c.tar.gz 磁帶,并構成了第二版Unix的有效C編譯器,

The second edition of Unix was developed for the PDP-11 at Bell Labs by Ken Thompson, Dennis Ritchie and others. It extended the First Edition with more system calls and more commands. This edition also saw the beginning of the C language, which was used to write some of the commands.The code here is only the source to some of the commands, some of the library functions, and the C compiler. The files in c/ come from the last1120c.tar.gz tape, and form a working C compiler for Second Edition Unix.

下載原始碼解壓縮之后,目錄結構如下:


 

感興趣的小伙伴可以下載下來研究一下,

二、BCPL、B、C語言比較

如果想要找到一種好的方式,來進行編程語言之間比較的話,那么非代碼莫屬,

1、三種語言代碼示例

下面分別使用BCPL、B、C三種語言實作一個簡單的程式:程式將三個數字a、b、c相加,并將結果賦值給sum,最后列印總和,

1)BCPL語言示例

GET "libhdr"

LET start() = VALOF

{ LET a, b, c = 1, 2, ,3

sum := a + b + c

writen(sum)

}

LET 宣告變數;

:= 符號為賦值符號 Go中也有該符號,表示函式內部區域變數,這里感覺很有意思的一點是:最初B語言之父肯.湯普遜把:=符號改成了=符號,現在,也作為Go語言之父之一,又把:=符號請回來了(冥冥之中的命運~),

從BCPL到B的過渡中,決定使用單個字符 = 代替賦值 :=Other fiddles in the transition from BCPL to B were introduced as a matter of taste, and some remain controversial, for example the decision to use the single character = for assignment instead of :=. Similarly, B uses /**/ to enclose comments, where BCPL uses //, to ignore text up to the end of the line. The legacy of PL/I is evident here. (C++ has resurrected the BCPL comment convention.) Fortran influenced the syntax of declarations: B declarations begin with a specifier like auto or static, followed by a list of names, and C not only followed this style but ornamented it by placing its type keywords at the start of declarations.

2) B語言示例

B語言的語言結構

main() {

-- statements --

}

newfunc(arg1, arg2) {

-- statements --

}

fun3(arg) {

-- more statements --

}

B語言代碼示例

main() {

auto a, b, c, sum;

a = 1; b = 2; c = 3;

sum = a+b+c;

putnumb(sum);

}

陳述句auto ...是一個宣告,即,它定義了要在函式內使用的區域變數;

putnumb 是一個帶引數的庫函式,它將在終端上列印一個數字,

3) C語言示例

#include <stdio.h>

void main(){

int a,b,c,sum;

a=1; b=2; c=3;

sum = a+b+c;

printf("%d", sum);

}

2、示例代碼中三者的區別

通過上面例子可以看出三者的區別:

C語言寫法更接近于B語言;

BCPL、B語言都是無型別的語言,用word/cell表示一個固定長度的bit,C語言是有型別的,

有一些地方,你可能感興趣:

++、-- 符號是Thompson發明的;

&&、|| 是在C語言引入的,

說明:

查了好久只找到了BCPL、B語言的部分代碼片段,至于能不能跑起來,我也不知道 ^_^;

如果想要知曉三者的具體區別的話,建議閱讀丹尼斯.里奇關于《C語言發展史》的文章;

BCPL、B語言也有經歷過若干次版本迭代 (因為,網上找到的代碼片段有很多寫法不一樣的地方,比如說,維基百科中找到的B代碼片段,與在Unix內核前幾個版本中找到的B代碼片段寫法就不一樣,個人推測是版本問題,不同的版本不同的寫法);

C語言更接近與B語言,或著說是在B的基礎上不斷的添加了很多新特性 (拋出2個問題:1.里奇起名字時為什么不像C++一樣,起名叫B++ ?2.為什么C++用了2個加號,而不是一個加號,叫C+ ?  歡迎腦洞夠大的同學在評論留言!);

如果有高手覺得上面的代碼片段有問題或者知道怎么跑起來的話,可以私下交流,

三、歷史為什么選擇C語言

1960s年代后期,貝爾實驗室對計算機系統的研究進入繁盛時期,MIT、General Electric、Bell實驗室合作的Mutlics專案以失敗而告終(1969年左右),就是在這個時期,Ken Tompson開始寫Mutlics的替代品,他希望按照自己的設計構造一個令人舒服的計算系統(也就是Unix),后來在寫出第一個版本的Unix時,覺得Unix上需要一個新的系統編程語言,他創造了一個B語言,B語言是沒有型別的C,準確說B語言是Tompson把BCPL擠進8K記憶體,被其個人大腦過濾后的產生的語言,

由于B語言存在的一些問題,導致其只是被用來寫一些命令工具使用,恰好在這個時期,Ritchie在B語言的基礎上,進行了重新的設計改良,從而誕生了C語言,

1973年,C語言基本上已經完備,從語言和編譯器層面已經足夠讓Tompson和Ritchie使用C語言重寫Unix內核,后來,Unix在一些研究機構、大學、政府機關開始慢慢流行起來,進而帶動了C語言的發展,

1978年,K&R撰寫的《The C Programming Language》出版,進一步推動了C語言的普及,

用一句話總結就是:對的時間、對的地點,出現了對的人以及工具 (Unix與C語言的關系,有點像GNU與Linux kernel的關系,都是互相成就),

四、標準C庫及代碼

C語言及其標準經過若干次迭代之后,就成了今天大家看到的樣子,其標準中指定了很多C標準庫,而不同的系統都有自己不同的代碼實作,

當然,Linux內核中也有實作了標準C庫的代碼,下面一起欣賞她的美,

1、標準C庫

ANSI C共包括15個頭檔案,1995年,Normative Addendum 1(NA1)批準了3個頭檔案(iso646.h、wchar.h和wctype.h)增加到C標準函式庫中,C99標準增加6個頭檔案(complex.h、fenv.h、inttypes.h、stdbool.h、stdint.h和tgmath.h),C11標準中又新增了5個頭檔案(stdalign.h、stdatomic.h、stdnoreturn.h、threads.h和uchar.h),

至此,C標準函式庫共有29個頭檔案:


 

2、 linux/lib/string.c

linux kernel版本:4.18.13

下面列出3個字串處理函式 strcpy()、strncpy()、strncat(),代碼出自Linus Benedict Torvalds之手,為什么這么說?看代碼頭部注釋,還是那個熟悉的味道stupid,看過git源代碼的人應該也會知道,git原始碼中也有類似注釋,

// SPDX-License-Identifier: GPL-2.0

/*

*  linux/lib/string.c

*

*  Copyright (C) 1991, 1992  Linus Torvalds

*/

/*

* stupid library routines.. The optimized versions should generally be found

* as inline code in <asm-xx/string.h>

*

* These are buggy as well..

*

* * Fri Jun 25 1999, Ingo Oeser <[email protected]>

* -  Added strsep() which will replace strtok() soon (because strsep() is

*    reentrant and should be faster). Use only strsep() in new code, please.

*

* * Sat Feb 09 2002, Jason Thomas <[email protected]>,

*                    Matthew Hawkins <[email protected]>

* -  Kissed strtok() goodbye

*/

// .......omit other......

// ...... here is my love code  .....

#ifndef __HAVE_ARCH_STRCPY

/**

* strcpy - Copy a %NUL terminated string

* @dest: Where to copy the string to

* @src: Where to copy the string from

*/

#undef strcpy

char *strcpy(char *dest, const char *src)

{

char *tmp = dest;

while ((*dest++ = *src++) != '\0')

/* nothing */;

return tmp;

}

EXPORT_SYMBOL(strcpy);

#endif

#ifndef __HAVE_ARCH_STRNCPY

/**

* strncpy - Copy a length-limited, C-string

* @dest: Where to copy the string to

* @src: Where to copy the string from

* @count: The maximum number of bytes to copy

*

* The result is not %NUL-terminated if the source exceeds

* @count bytes.

*

* In the case where the length of @src is less than  that  of

* count, the remainder of @dest will be padded with %NUL.

*

*/

char *strncpy(char *dest, const char *src, size_t count)

{

char *tmp = dest;

while (count) {

if ((*tmp = *src) != 0)

src++;

tmp++;

count--;

}

return dest;

}

EXPORT_SYMBOL(strncpy);

#endif

#ifndef __HAVE_ARCH_STRLCPY

#ifndef __HAVE_ARCH_STRNCAT

/**

* strncat - Append a length-limited, C-string to another

* @dest: The string to be appended to

* @src: The string to append to it

* @count: The maximum numbers of bytes to copy

*

* Note that in contrast to strncpy(), strncat() ensures the result is

* terminated.

*/

char *strncat(char *dest, const char *src, size_t count)

{

char *tmp = dest;

if (count) {

while (*dest)

dest++;

while ((*dest++ = *src++) != 0) {

if (--count == 0) {

*dest = '\0';

break;

}

}

}

return tmp;

}

EXPORT_SYMBOL(strncat);

#endif

#ifndef __HAVE_ARCH_STRLCAT

// .......omit other......

// ...... here is my love code  .....

第一次跟同學一起看這些代碼的時候,他說了一句話:這才叫代碼,其他的都是s-h-X-t,現在回想起,自己在實作這些代碼時,寫了一坨不知道是什么的東西,哎,代碼比代碼要扔~

閱讀他人代碼, 也是一種進步、成長,

五、廉頗老矣, 尚能飯否?

《史記·廉頗藺相如列傳》記載,廉頗被免職后,跑到魏國,趙王想再用他,派人去看他的身體情況,廉頗之仇郭開賄賂使者,使者看到廉頗,廉頗為之米飯一斗,肉十斤,被甲上馬,以示尚可用,使者回來報告趙王說:"廉頗將軍雖老,尚善飯,然與臣坐,頃之三遺矢(通假字,即屎)矣,"趙王以為廉頗已老,遂不用,

經歷過幾十年的風雨洗禮,C語言可謂風光無數,這世界上隨處可見它的身影,但是,同時在一些人眼里,可能覺得C語言已是暮年(將近50歲)、老矣,如同下圖:

如果你真這樣想,那你就錯了,

TIOBE Index for September 2020

TIOBE 2020-09 編程語言排行榜告訴你,C語言寶刀未老,還是那個風采耀眼的少年,


 

個人想說的是,只要計算機還是基于馮諾依曼體系結構,芯片還是基于物理制程,那么,都會有一片C的天空,因為,她知道一個最接近天空的地方(C是最接近匯編、機器語言的高級語言之一),

任他上層應用改朝換代,我(C語言)自巋然不動,這就是C,我心中的C語言,

總結

猛然間發現已經到了總結,但是還覺得仍舊意猶未盡,這并不是我心目中最真實的那個她,但是,我還是希望你看完本文之后,能夠多少了解與熟悉C的美與真實,


 

最后想說的是:縱使千言萬語也說不盡C語言的重要性,這些文字也僅僅只是冰山一角,

鑒于個人能力有限,如有問題或者缺陷,歡迎指正,


 

如果你想更好的提升你的編程能力,學好C語言C++編程!彎道超車,快人一步!
C語言C++學習企鵝圈子】,分享(原始碼、專案實戰視頻、專案筆記,基礎入門教程)
歡迎轉行和學習編程的伙伴,利用更多的資料學習成長比自己琢磨更快哦!

編程學習書籍:


 

編程學習視頻:


 

文章來源:https://mp.weixin.qq.com/s?__biz=Mzg4NzU1MzIzMA==&mid=2247529947

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/246716.html

標籤:C

上一篇:拒絕美國高額年薪和綠卡,回國做人工智能,他是中國編程第一人!

下一篇:Go語言開篇

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more