主頁 > 軟體設計 > 初識C語言(二)

初識C語言(二)

2021-10-19 07:04:54 軟體設計

目錄

一、變數的使用

二、變數的作用域和生命周期

三、常量的進一步了解

四、字串

五、轉義字符

六、注釋

七、總結


一、變數的使用

1、 在敘述變數的使用之前先說一個C語言中的輸入函式 scanf

(1)scanf 函式是C語言提供的一個輸入函式

scanf 函式的使用格式:

這里使用輸入整數舉例說明

  • 如果要輸入兩個整數,雙引號中就要寫兩個%d, 輸入n個整數就寫n個%d
  • %d與%d之間可以用空格隔開,也可以用逗號隔開
  1. 用空格隔開:scanf("%d %d",&num1,&num2);
  2. 用逗號隔開:scanf("%d,%d",&num1,&num2);
  • & --->取地址,使用scanf函式輸入資料時要在變數前加取地址符&
  • 雙引號引起來的內容[ "%d,%d" ]叫做格式控制符,在定義時使用什么格式,那么在輸入資料的時候就要使用該格式來輸入資料,
  • 例如:
  1. %d與%d之間使用空格隔開,那么在控制臺中輸入的兩個資料之間也要用空格隔開;
  2. %d與%d之間使用逗號隔開,那么在控制臺中輸入的兩個資料之間也要用逗號隔開;

(2)簡單說明一下在VS這個集成開發環境中使用scanf函式報錯的問題

如果在VS中使用scanf函式出現報錯,在給出的報錯資訊中有兩種解決方法:

VS中使用scanf函式的報錯資訊:

'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

方法一:在源檔案的第一行加上 #define _CRT_SECURE_NO_WARNINGS 1

#define 后面的內容就顯示在報錯的資訊中,可以直接在報錯的資訊中復制這段文字,后面的1是隨便寫的一個值,加不加都不影響使用,(建議盡量去復制 _CRT_SECURE_NO_WARNINGS這段文字,自己用鍵盤打出來有可能會出錯

注意:#define _CRT_SECURE_NO_WARNINGS 1 這句一定要放在代碼的第一行,放在其他位置就不起作用了,

補充:每次寫代碼的時候都要加 #define _CRT_SECURE_NO_WARNINGS 1 可能會比較麻煩,可以在電腦中搜索newc++file.cpp這個檔案(這個檔案是在你安裝的VS的的路徑下),搜索到這個檔案以后,將這個檔案拖到桌面中(檔案原路徑下不可以編輯修改)再進行編輯將#define _CRT_SECURE_NO_WARNINGS 1 這句話放到這個檔案中然后保存(也可以將經常用到的頭檔案保存在這個檔案中),保存完以后再將這個檔案拖回到原來的路徑下,這樣每次在VS中寫代碼的時候第一行都會默認加上這句話,

【因為此文章是講述C語言的知識點,VS的操作內容不會詳細講述,這里只是進行了一些文字描述,如果有不清楚的地方可以百度查看一下詳細的操作,也可以私信我,】

方法二:在報錯的資訊中提到可以使用scanf_s 來代替scanf函式(不推薦使用這種方法

scanf_s函式是vs編譯器提供的一種函式,不是C語言自己的,在其他的編譯器(gcc,clang......)下沒有scanf_s函式,其他編譯器也不認識這個函式,當你在代碼中使用了scanf_s函式,你的代碼在其他編譯器下就沒法正確的編譯,這樣就降低了代碼的跨平臺性,所以建議寫代碼時使用標準C提供的功能和函式,

如果好奇想使用scanf_s這個函式,一定要研究清楚它的使用方法再去使用,它的使用方法與scanf函式是有區別的,這里就不再過多的敘述,

2、變數的使用:需要變數就創建一個變數然后使用這個變數就可以了

這里給出兩整數相加的例子:

//stdio.h    標準輸入輸出頭檔案
#include<stdio.h>
//scanf 是C語言提供的一個輸入函式
//& --->取地址
int main()
{
	//兩個整數相加
	int num1 = 0;
	int num2 = 0;
	int sum = 0;
	//輸入兩個值
	scanf("%d %d", &num1, &num2);
	//計算
	sum = num1 + num2;
	//輸出
	printf("%d\n", sum);
	return 0;
}

運行結果:

也可以將sum在定義的時候直接使用:
#include<stdio.h>
int main()
{
//兩個整數相加
int num1 = 0;
int num2 = 0;
//輸入兩個值
scanf("%d %d", &num1, &num2);
//計算
int sum = num1 + num2;
//輸出
printf("%d\n", sum);
return 0;
}

這種寫法在老一點的編譯器中編譯會報錯,

C99標準之前有一個規定:變數要創建在當前代碼塊的最前面!

C99之后的語法中就支持了:變數在哪里使用就在哪里定義!


二、變數的作用域和生命周期

1、作用域:

作用域是程式設計概念,通常來說,一段程式代碼中所用到的名字并不總是有效、可用的,而限定這個名字的可用性的代碼范圍就是這個名字的作用域,

  • 區域變數的作用域是變數所在的區域范圍,

如果去點47行的代碼,就可以輸出變數b的值

區域變數a的作用域是在外面的 { } 內

  • 全域變數的作用域是整個工程,

2、生命周期:

變數的生命周期指的是變數的創建到變數的銷毀之間的一個時間段

  • 區域變數的生命周期是:進入作用域生命周期開始,出作用域生命周期結束,
  • 全域變數的生命周期是:整個程式的生命周期,

作用域描述的是變數的使用范圍,生命周期描述的是一個時間段,

作用域與生命周期是兩個不同的概念,二者只是有關聯,

我在另一篇文章中也講述了生命周期與全域變數,有興趣的老鐵可以去看一下,

CSDN


三、常量的進一步了解

C語言中的常量分為以下以下幾種:

  • 字面常量
  • const 修飾的常變數
  • #define 定義的識別符號常量
  • 列舉常量

1、字面常量

直接用鍵盤打出來的就是字面常量:

#include<stdio.h>
int main()
{
100;//整型常量
3.14;//浮點型別常量
'a';//字符常量
"abcd";//字串常量
return 0;
}

2、const 修飾的常變數

一個變數沒有被const修飾,那這個變數的值是可以改變的:

一個變數被const修飾后,那這個變數的值就不可以被修改:

const的用法:

當一個變數不想被別人修改,就可以在這個變數前面加const,

雖然加上const以后變數不能被修改,但是本質上它還是一個變數,

3、#define 定義識別符號常量

#define 定義的識別符號常量大寫小寫都可以,一般習慣大寫

4、列舉常量(這里只是簡單了解一下,后面還會講述)

列舉就是一一列舉

  • 生活中有很多值都是可以一一列舉的(比如性別:男、女、保密)
  • 有些值不適合一一的列舉(比如工資)

列舉是要定義后才可以使用:

//定義列舉型別
enum Sex
{
//列舉型別的可能取值---就是列舉常量
MALE,
FEMALE,
SECRET
}; //這個;必須要加
int main()
{
//列舉常量的使用
enum Sex s = MALE;
//列印列舉常量
printf("%d\n", MALE);
printf("%d\n", FEMALE);
printf("%d\n", SECRET);
return 0;
}

列舉常量不可以直接修改它的值

列舉常量的默認是從0開始,依次向下遞增1


四、字串

C語言中是沒有字串型別的,在C語言中由雙引號引起來的一串字符稱為字串字面值,或者簡稱字串,

例如:

"Hello World\n"
"abc";//字串
"a";//字串
"";//空字串

1、字串的定義:

char arr1[] = "abc";
char arr2[] = { 'a','b','c' };

2、輸出字串:

C語言中使用%s這個格式符輸出字串

3、列印字符陣列

為什么這個兩個字符陣列列印出來的內容不一樣呢?

接下來我們來看一下這兩個字符陣列在記憶體中的存盤:

從字符陣列在記憶體中的存盤可以發現arr1最后多了一個'\0',

字串的末尾其實隱藏一個'\0','\0'是字串的結束標志arr1在列印的時候遇到了'\0'就結束了,而arr2是一個字符一個字符放進去的,如果不放'\0'這個字符那么arr2是找不到結束標志的,所以arr2在列印出abc后不會停下來,直到在某個位置找到了'\0'才會停下來,所以abc后面就輸出了一些隨機值(亂碼),

如果想讓arr2也正常輸出,只要在字符'c'后面加上'\0',

我們再來看一下這兩個字符陣列在記憶體中的存盤:

由此可以得出:'\0'對字串是特別重要的!

字串的結束標志是一個 \0 的轉義字符,在計算字串長度的時候 \0 是結束標志,不算作字串內容,

4、strlen(string length)函式 :求字串長度的函式

在使用strlen這個函式的時候要引入#include<string.h>這個頭檔案

#include<stdio.h>
#include<string.h>
int main()
{
	//使用strlen這個函式求字串的長度
	int len = strlen("abc");
	printf("%d\n", len);
	return 0;
}

運行結果:

  • 接下來使用strlen函式計算兩個字符陣列的長度
#include<stdio.h>
#include<string.h>
int main()
{
	//可以把字串放在字符陣列中
	char arr1[] = "abc";
	char arr2[] = { 'a','b','c' };
	//使用strlen函式計算字符陣列的長度
	printf("%d\n", strlen(arr1));
	printf("%d\n", strlen(arr2));
	return 0;
}

運行結果:

輸出結果說明:

  • arr1字符陣列中的字串末尾隱藏了一個'\0',strlen在計算字符陣列長度的時候只計算'\0'之前的數,所以輸出3,
  • arr2字符陣列中是存放了3個字符,這些字符中也沒有'\0'這個字符,所以strlen在計算字符陣列長度時就會輸出一個隨機值(這個值有可能是3,9,18......等任何值),

在arr2字符陣列中放一個'\0'字符再輸出

雖然在'\0'字符后面又加了兩個字符,但是strlen在計算字符陣列長度時只計算'\0'前面的字符!


五、轉義字符

轉義字符就在轉變原來的意思

轉義字符釋義
\?在書寫連續多個問號時使用,防止他們被決議成三字母(現在基本用不到了)
\'用于表示字符常量'
\"用于表示一個字串內部的雙引號
\\用于表示一個反斜杠,防止它被解釋為一個轉義序列符,
\a用警告字符,蜂鳴
\b退格符
\f進紙符
\n換行
\r回車
\t水平制表符
\v垂直制表符

\ddd

ddd表示1~3個八進制數字,例如:\123 轉換后就是S

\xddd

dd表示2個十六進制數字,例如:\x30轉換后就是 0
#include<stdio.h>
int main()
{
	printf("hehenhehe");
	printf("\n------------\n");
	printf("hehe\nhehe");
	return 0;
}

運行結果:

\n就是一個轉義字符(\n就是一個換行);\0也是一個轉義字符

列印一個檔案路徑:

輸出幾個轉義字符看一下代碼執行結果:

重點說一下 \ddd \xdd這里的x只能是小寫)這兩個轉義字符

  • \ddd,ddd表示1~3個八進制數字

\123為什么是S呢?

\123其實是將八進制的123轉換成了十進制的83(計算程序:1*8^2+2*8^1+3*8^0=83)

83作為ASCII碼值所代表的字符就是S,所以\123會列印出S

補充:八進制是0~7,所以八進制數中最大的數是7,例如: \811、\181、\178這些都是錯的

  • \xdd,dd表示2個十六進制數字

\x30轉換后為什么是 0呢?

\x30其實是將十六進制的30轉換成了十進制的48(計算程序:3*16^1+0*16^0=48)

48作為ASCII碼值所代表的字符就是0,所以\x30會列印出0

補充:十六進制數是:0~9與a~f共同組成

再回到一開始的列印一個檔案路徑:

#include<stdio.h>
int main()
{
//列印一個檔案路徑
printf("E:\\2021_10_17\\test.c\n");
return 0;
}

運行結果:


六、注釋

C語言有兩種注釋方式:

  1. 單行注釋: //
  2. 多行注釋: /* */
  • // 這種是C99之后引入的注釋方式 ----->C++的注釋風格
  • /* 這種是C99之前C語言的注釋方式 ---->C語言的注釋風格*/
#include<stdio.h>
int main()
{
	//int a = 10; //單行注釋
	//int b = 20;
	/* 多行注釋
	printf("Hello World\n");
	printf("Hello World\n");
	printf("Hello World\n");
	printf("Hello World\n");
	printf("Hello World\n");
	printf("Hello World\n");
	*/
	return 0;
}

補充:多行注釋的缺陷是不支持嵌套注釋

注釋的作用:

  1. 代碼比較復雜最好加上注釋,時間久了有助于自己閱讀代碼,加上注釋也有助于別人閱讀你的代碼,
  2. 代碼暫時不用的時候,也可以注釋掉,

不要過分注釋,注釋不要寫的太過于詳細!


七、總結

C語言中有許多有趣的東西,可能看著代碼會覺得有些枯燥,看到一大堆文字會看不下去,

編程的學習在于多動手多寫代碼這樣才會有所識訓,

一開始寫代碼肯定會出現很多的問題,只有不斷的出錯不斷地改錯自己才會進步,

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

標籤:其他

上一篇:Python 讓小海龜互動起來——turtle和tkinter混合使用!

下一篇:編程的時候格式化強迫癥,還有救嗎(教你解決保存時自動格式化錯誤的煩惱~)

標籤雲
其他(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)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more