字串
“hello world.\n”
由雙引號引起來的一串字符被稱為字串字面值,簡稱字串
字串的結束標志是一個\0的轉義字符(在字串中一般不寫出來),在計算字串長度的時候\0是結束標志 ,不算作字串的內容,
下面來到編譯器中直觀感受字串的特征
1、
#include<stdio.h>
int main()
{
char arr1[]="Hello";
char arr2[]={'H','e','l','l','o'};
char arr3[]={'H','e','l','l','o','\0'};
char arr4[]="Hello\0";
printf("%s\n",arr1);
printf("%s\n",arr2);
printf("%s\n",arr3);
printf("%s\n",arr4);
return 0;
}
輸出結果
由此可見,arr1、arr2、arr4的輸出結果是一樣的,而arr4的結尾沒有加 \0導致其出現亂碼,
2、
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[]="Hello";
char arr2[]={'H','e','l','l','o'};
char arr3[]={'H','e','l','l','o','\0'};
char arr4[]="Hello\0";
printf("%d\n",strlen(arr1));
printf("%d\n",strlen(arr2));
printf("%d\n",strlen(arr3));
printf("%d\n",strlen(arr4));
return 0;
}
輸出結果
由此可見,arr1、arr2、arr4的長度都是一樣的,而arr3卻不一樣(arr3的長度為隨機值),只因為arr3的結尾沒有 \0 ,計算機不能準確找到arr3的結尾,因此會出現這個情況,
求字串長度時使用的strlen需要參考頭檔案 #include<string.h>,與使用printf需要參考頭檔案 **#include<stdio.h>**一樣,
轉義字符
轉義字符就是轉變其原來的意思
- \?
在連續書寫多個 ? 時使用,防止被決議為三字母詞(也被稱為三聯符序列,現在已經比較少見了)
- \’
表示字符常量 '
- \"
表示一個字串內部的雙引號
- \
表示一個反斜杠,防止其被解釋為一個轉義序列符
- \a
表示警告(在計算機讀到這個字符會發出蜂鳴聲)
- \b
退格符
- \f
進紙符
- \n
換行
- \r
回車
- \t
水平制表符(即鍵盤上的 “ TAB ”鍵位)
- \v
垂直制表符
- \ddd
表示一個1~3個八進制的數字,eg:\130 ~ 536(十進制)
- \xdd
dd表示2個十六進制的數字,eg:\x30 0 ~ 48(十進制)
一些轉義字符的使用
#include<stdio.h>
int main()
{
char ch1='\101';
char ch2 = '\x41';
printf("D:\code\test\2021\4\10\n");
printf("\"D:\code\\test\\2021\\4\\10\"\n");
printf("\v\t\v\t\v\t\v\t\n");
printf("%d\n",ch1);
printf("%d\n",ch2);
printf("%c\n", ch1);
printf("%c\n", ch2);
return 0;
}
輸出結果
其中 printf("%c\n", ch1);
輸出的是八進制 101 轉換成十進制 65后所代表的ASCII碼值所代表的符號,
拓展ASCII碼表
注釋
C語言中有兩種注釋
一個是 “//” ~ C++風格
一個是 /*…*/ ~ C語言風格
函式
#include<stdio.h>
int fun(int x,int y)
{
int z=0;
z=x+y;
return z;
}
int main()
{
int a=0;
int b=0;
scanf("%d%d",&a,&b);
int sum=fun(a,b);
printf("%d\n",sum);
return 0;
}
運行結果
其中 fun 就是我定義的函式
a和b被帶入 x,y 的值,并且進行我設計的計算后得到 z,然后通過 return z; 將 z 的值回傳到 fun
陣列
int arr[10]={1,2,3,4,5,6,7,8,9};
- 陣列中的 **[ ]**可以不輸入,但是輸入的必須是 常量
- 陣列中的第一個元素的下標為 0
char arr[]={‘a’,‘b’,‘c’,‘d’,’\0’};
- 字符陣列中的單個元素需使用 ‘’ 括起來
運算子
- 賦值運算子
=
+=
-=
*=
/=
&=
^=
|=
>>=
<<=
- 單目運算子
!
邏輯反操作
-
負值
+
正值
&
取地址
sizeof
運算元的型別長度(byte為單位)
~
對一個數的二進制按位取反
- -
前置、后置- -
++
與/- -類似
*
間接訪問運算子(解參考運算子)
- 邏輯運算子
&&
邏輯與
||
邏輯或
- 條件運算子
exp 1 ? exp 2 : exp 3
- 逗號運算式
exp 1 , exp 2 ,exp 3 ,…, exp n
- 下標參考、函式呼叫和結構成員
[ ]
( )
.
->
- 關系運算子
>
>=
<
!=
測驗“不相等 ”
==
用于測驗“相等 ”
常見關鍵字
auto
每個區域變數都是auto修飾的
break
case
需要搭配switch一起食用
char
const
continue
default
do
double
else
enum
extern
申明外部符號
float
for
goto
if
int
long
register
暫存器關鍵字
推薦將某個值放入暫存器中,以便于計算機能夠快速呼叫,一般計算器會自動將比較頻繁使用的值放到暫存器中,
return
short
signed
sizeof
static
修飾變數和函式
- 修飾區域變數-靜態區域變數
- 修飾全域變數-靜態全域變數
- 修飾函式-靜態函式
struct
switch
typedef
型別定義,型別重命名
union
聯合體(共同體)
unsigned
void
空的–啥也沒有
volatile
while
static
修飾區域變數
代碼1
#include<stdio.h>
void test()
{
int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
運行結果
代碼2
#include<stdio.h>
void test()
{
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
運行結果
由代碼1和代碼2可得
static 修飾區域變數改變了變數的生命周期(本質上是改變了變數的存盤型別),讓靜態區域變數出了作用域依然存在,到程式結束,生命周期才結束,
存盤型別
堆疊區
區域變數的引數
堆區
動態記憶體分配的
靜態區
全域變數
static修飾的區域變數
修飾全域變數
使全域變數失去了外部鏈接性,即只能在 本源檔案 使用
修飾函式
與修飾全域變數相似
define 定義常量和宏
#define定義的是識別符號常量
特點:
定義的識別符號不占記憶體,只是一個臨時的符號,預編譯后這個符號就不存在了
宏:
專業術語:
暗示著將小命令或動作轉化為一系列指令,.宏的用途在于自動化頻繁使用的序列或者是獲得一種更強大的抽象能力,
大白話:
某fps游戲插u盤事件
只需簡單的操作就可以精準爆頭,上天入地無所不能
Ps:“大白話”只是我自己的理解,不一定正確,深入探索沒有意義【狗頭】
在C語言中,宏都是由 #define 定義的
eg:
#include<stdio.h>
#define And(x,y)x+y
int main()
{
printf("%d\n", And(1, 2));
return 0;
}
運行結果
注意!!!
宏只是相當于替換掉了所需要進行的操作,需要和函式區分
eg:
#include<stdio.h>
#define And(x,y)x+y
int main()
{
printf("%d\n",3 * And(1, 2));
return 0;
}
運行結果
此時,
3 * And(1, 2) 進行的操作是 3*1+2 = 5
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/274724.html
標籤:其他
上一篇:SIMD










