第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
5.8 添加C/C++支持

本部分會學(xué)習(xí)如何在 Android Studio 中添加 C/C++ 支持,包括 NDK 及 CMake相關(guān)的知識。 Android 應(yīng)用開發(fā)很多都是使用 Java 或 Kotlin 語言,但是對運行效率要求比較高或者對安全性要求比較高的模塊,往往會采用 C/C++來編寫。通過本部分的學(xué)習(xí)之后,我們就會了解如何在 Java 中調(diào)用 C/C++ 接口。

Android Studio 開發(fā) C/C++ 例子

前面的小節(jié)我們學(xué)習(xí)了 C/C++ 支持環(huán)境的安裝和配置。本小節(jié)我們創(chuàng)建一個最簡單的支持 C/C++ 的項目實例。

C 語言程序結(jié)構(gòu)

上一個小節(jié) C 語言的簡介中我們對 C 語言已經(jīng)有了一個簡單的了解。這一節(jié)我們就來看一下 C 語言的程序結(jié)構(gòu),了解了 C 語言的程序結(jié)構(gòu)之后我們才能正式的開始編寫 C 語言程序。下面我們來看一個最簡單的 C 語言可執(zhí)行程序:

C 語言中的指針

C 語言的指針常常被人們認(rèn)為是 C 語言中的靈魂所在,可以完成很多高難度的操作。但是更多的人感覺 C 語言的指針的存在如同噩夢一般,因為稍不注意,就會引起災(zāi)難性的后果。不管你是不是喜歡 C 語言中的指針,我們都要學(xué)習(xí)這種看起來很神奇的東西。因為指針這個概念不是 C 語言首創(chuàng)的,而是蘇聯(lián)的計算機(jī)科學(xué)家首創(chuàng)的。

C 語言中的字符串

在前面 C 語言的變量類型中介紹過 C 語言中的變量類型。不知道大家有沒有注意到,在 C 語言中有字符類型的變量,但是沒有其他編程語言中經(jīng)常出現(xiàn)的字符串類型,在 JAVA 或者 C# 中用 string 這個關(guān)鍵字來聲明其類型。但是在 C 語言中是沒有這個變量類型的。

1. C 語言標(biāo)準(zhǔn)歷史

序號別稱全稱1C18ISO/IEC 9899:20182C11ISO/IEC 9899:20113C99ISO/IEC 9899:19994C95ISO/IEC 9899:1990/AMD 1:19955C90ISO/IEC 9899:19906C89ANSI X3.159-1989最新執(zhí)行的 C 語言的國際標(biāo)準(zhǔn)是序號為 1 的 C18 標(biāo)準(zhǔn)(ISO/IEC 9899:2018 (C18)),這個標(biāo)準(zhǔn)是 2018 年通過的 C 語言國際標(biāo)準(zhǔn)。那么 C 語言的標(biāo)準(zhǔn)中都規(guī)定了哪些內(nèi)容呢?下面我們一起來看下:

C 語言中的 maclloc free()

在幾乎所有的情況下, C 語言都可以自動的來分配內(nèi)存,這不需要你的參與。這很高效,也很安全。這也是目前主流語言所采取的策略。但是 C 語言除了系統(tǒng)自動分配和回收內(nèi)存,還可以自己手動來分配和回收內(nèi)存,讓你的程序更具有靈活性。

C 語言中的類型轉(zhuǎn)換

我們在前面學(xué)習(xí)了 C 語言的數(shù)據(jù)類型,那么變量在參與運算的時候類型是始終如一不變的嗎?帶著這個疑問,我們可以先看一個例子:#include <stdio.h>#define typename(x) _Generic((x), /* Get the name of a type */ \ \ _Bool: "_Bool", unsigned char: "unsigned char", \ char: "char", signed char: "signed char", \ short int: "short int", unsigned short int: "unsigned short int", \ int: "int", unsigned int: "unsigned int", \ long int: "long int", unsigned long int: "unsigned long int", \long long int: "long long int", unsigned long long int: "unsigned long long int", \ float: "float", double: "double", \ long double: "long double", char *: "pointer to char", \ void *: "pointer to void", int *: "pointer to int", \ default: "other")int main(){ int a=1,b=2; float c=3.14159,d=0; printf("a type: %s, b type: %s, c type: %s, d type: %s\n",typename(a),typename(b),typename(c),typename(d)); a=b+c; printf("a=b+c, a=%d\n",a); printf("type (b+c): %s\n",typename(b+c)); d=b+c; printf("d=b+c, d=%f\n",d); return 0;}經(jīng)過編譯運行后得到如下的結(jié)果:Tips:有關(guān)如何編譯運行的內(nèi)容請參考前面的章節(jié)。Tips:同時值得注意的是,這個程序中的 _Generic 來自于 C11 標(biāo)準(zhǔn)中,所以在你之前可能看到的 C 語言的書籍中是沒有的。請大家不要使用過于古老的編譯器,請使用推薦的較新的編譯器。也就是支持 C11 以上標(biāo)準(zhǔn)的編譯器。具體情況可以參照你們所選擇的編譯器的手冊?;蛘咧苯舆x擇 GCC 7 及更新版本的編譯器。a type: int, b type: int, c type: float, d type: floata=b+c, a=5type (b+c): floatd=b+c, d=5.141590這里面的 a, b 變量為整形,而 c 和 d 都是浮點型。那么當(dāng)一個整形和一個浮點型相加的時候會發(fā)生什么呢?這就是我們今天要介紹的內(nèi)容。

3. C 語言的應(yīng)用

了解了發(fā)明過程就大致知道了 C 語言的應(yīng)用場景?;镜膽?yīng)用場景是操作系統(tǒng)的編寫。當(dāng)然現(xiàn)在 C 語言的應(yīng)用已經(jīng)大大超出了這個范圍。因為 C 語言與生俱來的特性是很容易與底層硬件打交道,所以目前 C 語言大量應(yīng)用在需要直接硬件交互的場景。比如最近很多的物聯(lián)網(wǎng)中的嵌入式設(shè)備,底層驅(qū)動,高性能計算,游戲后端服務(wù),圖形處理等等。但是由于 C 語言不支持原生的面向?qū)ο蟮拈_發(fā)模式,因此有人說過,對于 C 語言,最大的工程就是開發(fā)一個操作系統(tǒng)。如果你想開發(fā)更為復(fù)雜的系統(tǒng),請使用別的語言。但是這不代表 C 語言已經(jīng)過時了。恰恰相反, C 語言正在我們的生活中發(fā)揮著比以前更為重要的角色,你的手機(jī),你的身邊的智能終端,甚至你家的掃地機(jī)器人,都無時不刻都有 C 語言的身影。圖2: 用 C 語言實現(xiàn)的 MP3 播放器 [4]圖2: 用 C 語言實現(xiàn)的 MP3 播放器內(nèi)部 [4]

C 語言的編譯

上一個小節(jié) C 語言的程序結(jié)構(gòu)中我們簡單的認(rèn)識了一下 C 語言的程序到底由那些部分組成,但是僅僅了解 C 語言的程序結(jié)構(gòu)還不夠,僅僅是萬里長征走完了第一步,后面還需要進(jìn)行很多的步驟才能讓程序成為一個可以使用的工業(yè)產(chǎn)品。還記的上一個小節(jié)中我們提到的 gcc 嗎?其實這是一個 C 語言的編譯器,這一個小節(jié)我們就來學(xué)習(xí)一下編譯器這個概念。

1. C 語言的注釋標(biāo)準(zhǔn)

C 語言的注釋目前有兩種:多行注釋(經(jīng)典式注釋)單行注釋(C++ 式注釋)

C 語言中的 while 循環(huán)

while 循環(huán)語句是 C 語言中最常用的三種循環(huán)語句之一。很多時候我們會使用這種循環(huán)來處理無窮無盡的各種請求和響應(yīng)。

2. C 語言中定義變量

在 C 語言中定義變量如下:int x;上面這行代碼就聲明了一個名為 x 的變量,這行代碼分為三部分:int:int 表示變量存儲的數(shù)據(jù)類型。數(shù)據(jù)類型的概念我們下個小節(jié)詳細(xì)講解;x:x 表示變量名稱;;:C 語言代碼每一行都用分號結(jié)尾。

1. C語言的起源

C 語言是一種高級語言,最初由 Dennis M. Ritchie [1] 為了開發(fā)一個操作系統(tǒng)而設(shè)計,最早在 1972 年在 DEC PDP-11 計算機(jī)上被首次實現(xiàn)。

C 語言中的變量類型

對于 C 語言的變量類型這里有兩種說法:一種是只包含基礎(chǔ)的變量類型,如整數(shù)型,浮點型等;另外一種則是在上述類型的基礎(chǔ)上還包含了一些用戶可以定義的復(fù)合的類型,如 array,structure 等等。我們這里只介紹大家通常意義上所認(rèn)識的前一種基本的 C 語言數(shù)據(jù)類型。更為復(fù)雜的這些數(shù)據(jù)組合的結(jié)構(gòu),我們會在后面單獨列出。

1. C 語言編譯器

每個語言都需要編譯器,甚至包括可以直接操作 CPU 內(nèi)部寄存器的匯編語言。編譯器的作用就是將我們用接近人類自然語言編寫的程序翻譯成計算機(jī)可以直接執(zhí)行的二進(jìn)制文件。其實使用二進(jìn)制是人類在計算機(jī)發(fā)明過程中妥協(xié)于工程實踐的一個行為。因為從最高效率的數(shù)字進(jìn)制來說,三進(jìn)制其實更為有效率,但是實現(xiàn)起來不那么容易。C 語言的編譯器有非常多種,下面我們列舉了一些,供大家參考。編譯器編譯器作者支持的操作系統(tǒng)是否有相關(guān)的集成開發(fā)環(huán)境授權(quán)許可類型AMPCAxiomatic Solutions Sdn BhdWindows,Unix & OtherYesProprietaryAmsterdam Compiler KitAndrew Tanenbaum and Ceriel JacobsUnix & OtherNoBSDCCS C CompilerCCS, Inc.Windows,Unix & OtherYesProprietaryClangLow-Level Virtual MachineWindows,Unix & OtherNoBSDDMS Software Reengineering ToolkitSemantic DesignsWindows,Unix & OtherNoProprietaryGCC CGNU ProjectWindows,Unix,IBM mainframe, AmigaOS, VAX/VMS, RTEMSNoGPLRCC (RCOR C Compiler)Rodrigo Caetano (rcor)Windows,UnixNoGPLInteractive CKISS Institute for Practical RoboticsWindows, Unix, Mac, Linux, IRIX,Solaris, SunOSNoLabWindows/CVINational InstrumentsWindows,Unix & OtherYesProprietarylccChris Fraser and David HansonWindows,Unix & OtherWindows onlyFreeware (source code available for non-commercial use)Mark Williams CMark Williams CompanyWindows,OtherYesProprietaryMicrosoft CMicrosoftWindowsYesProprietaryNwccNils WellerWindows,Unix,OtherNoBSDOpen64SGI Google HP Intel Nvidia PathScale Tsinghua University and othersUnix,OtherNoGPLPelles CPelle OriniusWindowsYesFreewarePGCCThe Portland GroupWindows,Unix,Other— Mac OS XYes — Visual Studio on WindowsProprietaryPortable C CompilerAnders Magnusson and othersWindows,Unix,OtherNoBSDPower CMix SoftwareOtherNoProprietaryQuickCMicrosoftWindowsYesProprietarySAS/CSAS InstituteWindows,Unix,Other-IBM mainframe, AmigaOS, 68K, 88K, UnixYesProprietaryTiny C CompilerFabrice BellardWindows,UnixNoLGPLTurbo CEmbarcaderoOtherNoProprietary - V 2.01 freely availableCCS C CompilerCCS, Inc.Windows,Unix,OtherYesProprietaryMikroC CompilerMikroElektronika, Inc.Windows,Unix,OtherYesProprietaryups debugger (includes C interpreter)Tom Hughes, Ian Edwards, and othersUnix,Other-Solaris, SunOSYesGPLVBCCDr. Volker BarthelmannWindows,Unix,OtherNoFreeware (source code available,XL CIBMUnix-AIXEclipseProprietary當(dāng)然,編譯器還與計算硬件平臺息息相關(guān)。同一個編譯器會因為計算機(jī)體系結(jié)構(gòu)不同而分為不同的版本。如 arm64,armhf,x86, x86_64,PowerPC 等等。在本教程中,我們主要會使用到 gcc 編譯器。同時我們會在 arm64,armhf,x84_64 等硬件平臺上編譯我們的程序。從中可以看出 C 語言的移植性還是很好的。同樣的程序,我們可以在不同的編譯器以及硬件平臺上編譯執(zhí)行。Tips:請大家注意,我們的學(xué)習(xí)要求操作系統(tǒng)為 Windows 10,Linux, Unix, 或者 MacOS。對于微軟已經(jīng)停止維護(hù)的 Windows 7 以及更早的系統(tǒng)。我們沒有辦法使用新的特性來編譯和運行相關(guān)的程序。

C 語言中的 for 循環(huán)

for 循環(huán)廣泛存在于 C 語言中的各個角落中。擔(dān)負(fù)著完成根據(jù)給定條件,完成有限次循環(huán)的重任。

5. C 語言的幾個主要版本

從 C 語言發(fā)明到現(xiàn)在經(jīng)歷了如下的標(biāo)準(zhǔn):版本標(biāo)準(zhǔn)發(fā)布日期K&Rn/a1978-02-22C89ANSI X3.159-19891989-12-14C90ISO/IEC 9899:19901990-12-20C95ISO/IEC 9899/AMD1:19951995-03-30C99ISO/IEC 9899:19991999-12-16C11ISO/IEC 9899:20112011-12-15目前 C 語言執(zhí)行的標(biāo)準(zhǔn)是 ISO/IEC 9899:2011,我們在課程中也會遵循此標(biāo)準(zhǔn)來完成代碼。

C 語言的標(biāo)準(zhǔn)

什么是標(biāo)準(zhǔn)?標(biāo)準(zhǔn)是對重復(fù)性事物和概念所做的統(tǒng)一規(guī)定,他以科學(xué)技術(shù)和實踐經(jīng)驗的結(jié)合成果為基礎(chǔ),經(jīng)有關(guān)方面協(xié)商一致,由主管機(jī)構(gòu)批準(zhǔn),以特定形式發(fā)布作為共同遵守的準(zhǔn)則和依據(jù)。在這個標(biāo)準(zhǔn)概念大行其道的今天,如果大家在生活中稍微注意一下,其實可以很容易發(fā)現(xiàn),我們生活在一個標(biāo)準(zhǔn)化的世界里,每個產(chǎn)品的外包裝或者標(biāo)簽上都會注明相應(yīng)的執(zhí)行標(biāo)準(zhǔn)。標(biāo)準(zhǔn)貫穿著我們的衣食住行。??偠灾?,標(biāo)準(zhǔn)無處不在。當(dāng)然標(biāo)準(zhǔn)具有行業(yè)性與地域性。每個國家基本都有自己的標(biāo)準(zhǔn),這些標(biāo)準(zhǔn)有些是自己獨立創(chuàng)造的,但更多的,為了與國際上大部分標(biāo)準(zhǔn)兼容,基本上會使用國際上一些通用的標(biāo)準(zhǔn),只是改一下名字就可以了。作為軟件行業(yè)中的老大哥級人物。C 語言也有自己的標(biāo)準(zhǔn),而且是國際標(biāo)準(zhǔn)。如果大家遵循同一個標(biāo)準(zhǔn),那么就會避免分歧的產(chǎn)生,避免出現(xiàn)很多不必要的麻煩和困擾。按照這統(tǒng)一標(biāo)準(zhǔn)就不會出現(xiàn)不兼容的問題。我們先來看下 C 語言標(biāo)準(zhǔn)的發(fā)展歷史:

C 語言中的 union

由于 C 語言是強(qiáng)類型語言,不能如同某些語言一樣,可以在變量中存儲任意元素。所以在有的時候會遇到一些問題。比如你有一個變量需要存儲計算結(jié)果,計算結(jié)果有時可能是整數(shù),有時可能是浮點數(shù)。這里我們介紹其中可以做到不更改變量名就可以存儲不同類型數(shù)據(jù)的變量。

4. C 語言的特點

C 語言有如下的特點:代碼簡潔不繁瑣;具有良好的可移植性,代碼與機(jī)器底層獨立(相對于匯編語言而言);屬于中層編程語言(底層的為匯編語言等,高層的為 Java 語言等);結(jié)構(gòu)化語言;豐富的程序庫可以使用;可以直接管理內(nèi)存;運行速度快;提供了指針操作;可以使用遞歸;具有良好的擴(kuò)展性。

C 語言中的 printf() 格式輸出

作為 C 語言中主力的標(biāo)準(zhǔn)輸出函數(shù), printf 為我們提供了豐富的格式選項。

C 語言中的 do-While 循環(huán)

do-while 循環(huán)語句是 C 語言中最常用的三種循、環(huán)語句之一。但也是最容易與前面的 while 循環(huán)混淆的循環(huán)語句。

4. 在 Windows 下編譯 C 語言

以前在 Windows 下直接編譯 C 語言是一件困難的事情。要么使用諸如 Visual Studio 之類的 IDE,要么安裝 Cygwin 這類的模擬環(huán)境。但是在目前 Windows 10 中,現(xiàn)在有了更便捷的選擇。可以安裝 WSL 環(huán)境, 全稱為 Windows Subsystem for Linux。大家可以通過搜索上面的關(guān)鍵字來查找安裝方式。在這里我將微軟的官方文檔鏈接放在這里,方便大家安裝。這里有詳細(xì)步驟,以及大家在安裝過程中會經(jīng)常遇到的安裝問題等。適用于 Linux 的 Windows 子系統(tǒng)安裝指南 (Windows 10)在選擇安裝 Ubuntu 后,就可以按照上面在 Linux 環(huán)境下編譯 C 語言的方式來編譯了。Tips:這時候大家可能很好奇文件路徑的問題。在 Windows 10 中的盤符,是掛載在 WSL 系統(tǒng)中 /mnt 目錄下的。比如你的用戶名叫 mooc,那么你的文檔目錄下存儲了源代碼,你要怎么進(jìn)入 文檔 這個目錄呢?cd /mnt/c/Users/mooc/Documents/

C 語言中的字符串函數(shù)

C 語言中的字符串雖然不是一種獨立的數(shù)據(jù)類型,但是這并不影響其重要地位,所以在 C 語言中會有一些專門針對字符串的函數(shù)。

C 語言中的邏輯運算符

在之前的 C 語言標(biāo)準(zhǔn)中,邏輯運算符是表示兩個數(shù)值之間邏輯關(guān)系的運算符。通常用 0 和 1 來表示假值和真值。但是在 C 語言中會認(rèn)為非 0 的數(shù)值在邏輯運算中都為 1 。邏輯運算的返回值也是整數(shù)型,不是 0 就是 1 ,這點和其他很多編程語言是不同的。但是,在 C99 標(biāo)準(zhǔn)中引入了布爾類型。所以 C 語言中的邏輯運算就簡單了很多。要想使用布爾類型,需要引入 stdbool.h 這個庫即可。但是遺憾的是,到目前為止還沒有可以直接輸出布爾值的打印語句。所以即使定義了布爾類型,在輸出的時候還是只能直接輸出整數(shù)值。當(dāng)然可以通過后面介紹的三目運算符來很輕松的解決這個問題。我們留到后面介紹。ABA && B(A與B)A || B(A或B)!A(非A)!B(非B)100101010110000011111100

C 語言中的算數(shù)運算符

上一個小節(jié)我們對 C 語言的運算符有了一個基本的了解,這節(jié)課我們來詳細(xì)的看下運算符中的算術(shù)運算符:

2. C 語言標(biāo)準(zhǔn)內(nèi)容

這里我將國際標(biāo)準(zhǔn)化組織最新的 C 語言的標(biāo)準(zhǔn)的一部分內(nèi)容放在這里,因為所有的標(biāo)準(zhǔn)都不是免費提供的,有興趣的同學(xué)可以購買看一下全文。那么這些標(biāo)準(zhǔn)里面都有哪些內(nèi)容呢?因為我并沒有購買 C 語言的最新標(biāo)準(zhǔn),所以我找了一點來自于 C 語言標(biāo)準(zhǔn)中描述。下面這段話就通過文字的描述,定義了有關(guān) main 函數(shù)的細(xì)節(jié):The function called at program startup is named main. The implementation declares no prototype for this function. It shall be defined with a return type of int and with no parameters: int main(void) { /* ... */ }or with two parameters (referred to here as argc and argv, though any names may be used, as they are local to the function in which they are declared): int main(int argc, char *argv[]) { /* ... */ }or equivalent;10) or in some other implementation-defined manner.這里寫明了 main 函數(shù)是做什么的,應(yīng)該怎么寫,包含了什么參數(shù)以及返回值等。正確的 main 函數(shù)的正確的書寫方法應(yīng)該是 int main(void) { /* ... */ } 或者 int main(int argc, char *argv[]) { /* ... */ } 。而不是我們國內(nèi)隨處可以看到的 void main(void) {/* ... */} 或者 void main(int argc, char *argv[]) { /* ... */ }。這種寫法在有的編譯器下是會產(chǎn)生錯誤的,導(dǎo)致編譯無法進(jìn)行。而且這個返回值是可以輸出的,可以作為程序是否正確執(zhí)行的判斷,比如你可以用返回值 0 放在程序執(zhí)行完整后返回,返回 0 就可以判斷程序完整執(zhí)行了。如果返回了其他數(shù)值,那么程序就出現(xiàn)了異常。由于購買標(biāo)準(zhǔn)太貴了,需要 198 瑞士法郎,折合人民幣 1422.08 元,所以這里只能給大家看一點從其他網(wǎng)站上找到的信息。不過超過 500 頁的標(biāo)準(zhǔn)全文對于大家學(xué)習(xí)這門語言也沒有太大的益處。只要記住在最新的是最好的就可了。

3.1 可以跟蹤 C 順序的索引

跟 list 類似,每個元素都對應(yīng)有相應(yīng)的 id。在按照 C 順序跟蹤索引的時候,數(shù)組的索引可以按照下圖來直觀理解:C 順序的索引上述索引的標(biāo)注是按照行優(yōu)先的順序進(jìn)行的。案例設(shè)置 flags=["c_index"],可以實現(xiàn)類似 list 的 enumerate 函數(shù)的效果:cit = np.nditer(arr, flags=["c_index"])while not cit.finished: print("value:", cit[0], "index:<{}>".format(cit.index)) cit.iternext()打印結(jié)果為:value: 0 index:<0>value: 1 index:<1>value: 2 index:<2>value: 3 index:<3>value: 4 index:<4>value: 5 index:<5>在上述代碼中,同過 while 循環(huán)可以逐步打印出每個元素的值和索引。

C 語言中的數(shù)組

數(shù)組是編程語言中用來存儲元素的集合。在 C 語言中,集合是儲存相同類型元素的集合。并且可以通過一個名稱來來訪。--------------------------------------------| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | …… | N-1 |--------------------------------------------第一個元素 最后一個元素在數(shù)組中,數(shù)組的訪問是用索引位置 0 開始的,最后一個元素的位置的索引是 N-1。所以你存入的第一個元素的位置編號是 0 ,而不是 1 。請大家注意這點。

首頁上一頁1234567下一頁尾頁
直播
查看課程詳情
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號