C學(xué)習(xí)筆記

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

gcc -v編譯環(huán)境

  • cmd中g(shù)cc 文件名.c編譯生成.exe文件

Hello World

#include <stdio.h>
#include <stdlib.h>
int main()
{
printf("hello world!¥n");
return 0;
}
- 注釋
// 單行注釋
/*多行注釋*/
#include <stdio.h>
main()方法
- 每個(gè)獨(dú)立的C程序必須要有main()方法,這是C程序執(zhí)行的起點(diǎn)。
  - int main()
{
代碼體;
return 0;
}
- error時(shí)return 1;

IO交互

  • 輸入(input)
//scanf()方法
int age;
printf("Enter you age :");
scanf("%d", &age);
  - &:指針,變量指定長度后可以不加&符號(hào)
  - age:如果字符串中有空格,會(huì)發(fā)生截位
  - 可以用多個(gè)變量接收space前后內(nèi)容
  - scanf("%d");
  - 讀取數(shù)據(jù)后再scanf可以清空input buffer
printf("You age is %d" ,age);
//fgets()方法
char name [20];
printf("Enter you name :");
fget(name, 20, stdin);
  - 變量,長度,標(biāo)準(zhǔn)輸入
  - 會(huì)忽視字符串中的空格,顯示一整行內(nèi)容
printf("You name is %s", name);
  - fget時(shí),%s后面會(huì)換行
  - name[strlen(name) - 1] ~ '¥0';不換行
  • 輸出(output)
printf("內(nèi)容1¥n內(nèi)容2")
  - 換行
  - 格式化字符
    - %s,d,c,lf占位符,和python用法一樣
    - %.2f表示只要兩位小數(shù)
printf("%s"), "hello world"
printf("%p", &變量)       // 打印變量的指針地址

命令的結(jié)尾

  • C程序內(nèi)每條命令的結(jié)尾是分號(hào)“;”

數(shù)據(jù)類型

  • 常量:

    • const int num = 5;
  • 字符型

    • char grade = 'A'; 1byte -128 ~+127
    • char name[長度] = "allen";
    • unsigned char = 255;1byte 0-255
  • 整型

    • int age = 18; 4byte
    • unsigned int = 4294967295L;4byte
    • short int = 32767;2byte
    • unsigned short int = 65535;2byte
    • float price = 3.5;4byte
    • double height = 1.83;8byte
  • 布爾型

    • bool flag = true;1byte
  • 數(shù)組:Array

    • int nums[長度] = {2, 4, 5, 8};
    • printf("%d", nums[1]); // 結(jié)果:4,index從0開始計(jì)算
    • 數(shù)組長度
      • sizeof(數(shù)組)
        • 長度單位為byte字節(jié)數(shù),需整除換算
      • strlen(數(shù)組)
        • 字符型數(shù)組長度
    • 二維數(shù)組
      • int nums [2] [3] = {{1,2,3}, {4,5,6}} // 2行3列
      • 字符型數(shù)組不能直接=賦值
      • 可以用strcpy函數(shù)更新字符串的值

結(jié)構(gòu)體:struct

struct 結(jié)構(gòu)體名
{
子屬性1;
子屬性2;
};
struct Player
{
char name[12] ;
int age;
}
// 創(chuàng)建自定義實(shí)例
// struct 結(jié)構(gòu)體名 實(shí)例名;
struct Player player1;
   - 引用自定義類型
   - 結(jié)構(gòu)體名.子屬性
Player.name
// 結(jié)構(gòu)體很像面向?qū)ο蟮念?,但是沒有方法,只有屬性

自定義:typedef

// 用于給已存在的數(shù)據(jù)類型起別名
typedef struct
{
char name[25];
char pwd[12];
int id;
} User
User user1 = {"allen", "password", 00123}    // 創(chuàng)建user1實(shí)例,User可看作數(shù)據(jù)類型

枚舉:enum

// enum 變量{值1,值2...}    // enum是自定義的int型
enum Day{Sun,Mon,Tue,Wed,Thu,Fri,Sat};
  - sun = 1,...sat = 7
enum Day today = Sun;    // 結(jié)果為1
  - enum目的是增加可讀性

運(yùn)算符與表達(dá)式

  • 單元運(yùn)算符

只需要一個(gè)運(yùn)算符就可以運(yùn)算,這類運(yùn)算符稱為單元運(yùn)算符

  • 自增i++,先運(yùn)算后加
  • 自增++i,先加后運(yùn)算
  • 自減i--,先運(yùn)算后減
  • 自減--I,先減后運(yùn)算

二元運(yùn)算符

需要有兩個(gè)運(yùn)算符才可以運(yùn)算的符號(hào)稱為二元運(yùn)算符

  • 賦值運(yùn)算符
    變量1 = 變量2 // 變量2賦值給變量1
    變量1 == 變量2 // 不是賦值是比較,判斷變量2是否等于變量1

  • 算數(shù)運(yùn)算符
    加法(+) // 復(fù)合運(yùn)算為:+=
    減法(-) // 復(fù)合運(yùn)算為:-=
    乘法(*) // 復(fù)合運(yùn)算為:*=
    除法(/) // 取商,復(fù)合運(yùn)算為:/=
    求余(%) // 取余,復(fù)合運(yùn)算為:%=

  • 比較運(yùn)算符
    大于(>)
    小于(<)
    大于等于(>=)
    小于等于(<=)
    等于(==)
    不等于(!=) // !也叫反向運(yùn)算符

  • 邏輯運(yùn)算符
    或(&&):a&&b,a和b都false才false,否則true
    與(||):a||b,a和b都true才true,否則false
    非(!): !a,結(jié)果和a的結(jié)果正好相反
    異或(^):a^b,a和b結(jié)果不同則true,相同為false

  • 位運(yùn)算
// &(and)或
int x = 6;     // x=00000110
int y = 12;    // y=00001100
int z = 0;    // z=00000100
/*
0 : 0 = 0
1 : 1 = 1
0 : 1 = 0
1: 0 = 0
*/
// 結(jié)果為and兩邊相等的值
//  |(or)與
int x = 6;    // x=00000110
int y = 12;    // y=00001100
int z = 14;    // z=00001110
/*
 0 : 0 = 0
1 : 1 = 1
0 : 1 = 1
1: 0 = 1
*/
// 結(jié)果為or一邊為1則為1
// ^(XOR)非
int x = 6;    // x=00000110
int y = 12;    // y=00001100
int z = 10;    // z=00001010
/*
0 : 0 = 0
1 : 1 = 0
0 : 1 = 1
1 : 0 = 1
*/
// 結(jié)果為兩邊不同則為1
// <<(left shift)左移
// x=00000110
z = x << 1;
// z = 00001100
  - 往左移動(dòng)一位,末尾補(bǔ)0,z = 12
z = x << 2;
// z = 00011000
  - 往左移動(dòng)2位,末尾補(bǔ)00,z = 24
// >>(right shift)右移
// x=00000110
z = x >> 1;
// z = 00000011
  - 往右移動(dòng)一位,開頭補(bǔ)0,末尾去0,z = 3
z = x >> 2;
// z = 00000001
  - 往右移動(dòng)2位,開頭補(bǔ)0,末尾去1,z = 1

三元運(yùn)算符

需要三個(gè)運(yùn)算符進(jìn)行運(yùn)算,這類運(yùn)算符稱為三元運(yùn)算符
表達(dá)式? X:Y // true則返回X,false則返回Y
例如:a>b? a:b;

流程控制

  • 分支

// if語句
if(條件1) {
真代碼1;
}else if(條件2){
真代碼2
}else{
假代碼;
}
// switch語句
switch(表達(dá)式){
case 值1:
  代碼1;
  break;
case 值2:
  代碼2;
  break;
default:
  代碼n
}
default不用break跳出語句
  • 循環(huán)

// for循環(huán)
for(初始化計(jì)數(shù)器;循環(huán)條件;自增減){}
for(int i = 1; i <=10; i ++)
{
  循環(huán)體;
}
// while循環(huán)
while(條件){循環(huán)體}
while(i < 10)
{
  printf(i);
  i++;
}
// do while循環(huán)
do{
  循環(huán)體;
}while(條件);
- 先執(zhí)行一遍循環(huán)體,在判斷是否繼續(xù)循環(huán)

跳出語句

  • continue
    • 跳過本次循環(huán)
  • break
    • 跳出循環(huán)體

函數(shù)

  • 內(nèi)置函數(shù)

//string.h
  - strlwr(變量)    // 轉(zhuǎn)小寫
  - strupr(變量)    //轉(zhuǎn)大寫
  - strcat(變量1,變量2)    // 合并字符串
  - strncat(變量1,變量2,長度)    // 把變量2的指定長度字符合并在變量1后面
  - strcpy(變量1,變量2)    // 把變量1替換為變量2
  - strncpy(變量1,變量2,長度)    //把變量2指定長度字符替換變量1對(duì)應(yīng)長度內(nèi)容
  - strset(變量,'?')    // 把變量全替換成?問號(hào)
  - strnset(變量,'?', 1)    // 把變量第1位替換成?問號(hào)
  - strrev(變量)    // 把字符串內(nèi)容反過來
  - strlen(變量)    // 字符串長度
  - strcmp(變量1,變量2)    // 變量1等于變量2,則返回0,否則不等于0
// math.h
// ctype.h
// time.h
// stdbool.h    引用布爾值
- toupper(變量):轉(zhuǎn)大寫
- rand():隨機(jī)數(shù)
  - 函數(shù)在time.h下
  - srand(time(0));    // 控制時(shí)間,沒有這句則無法隨機(jī),而是固定數(shù)
  int num = (rand( )% 6) + 1;    // 1-6之間的隨機(jī)數(shù)
  • 自定義函數(shù)

/*
類型 函數(shù)名()
{
函數(shù)體;
}
*/
  - 在main()函數(shù)調(diào)用
  - 函數(shù)名()即可調(diào)用
void hello()
{
printf("hello");
}
int main()
{
hello();
}
// 傳參
- 實(shí)參
    - 主方法調(diào)用函數(shù)時(shí)傳遞的值
    - 編譯時(shí)不會(huì)檢查傳遞參數(shù)個(gè)數(shù),即使錯(cuò)了也會(huì)繼續(xù)編譯
- 形參
    - 接收傳遞的值,參數(shù)類型個(gè)數(shù)要一致
    - 變量名可以與實(shí)參不相同
- return語句
  - 返回函數(shù)的結(jié)果給調(diào)用的地方
  - return的數(shù)據(jù)類型要和本身函數(shù)的類型相同
  - 也可以return表達(dá)式
- 建議
  - 建議把main函數(shù)放在最頂端,可在main函數(shù)上面加自定義函數(shù)原型
void hello(char [], int);
  - 自定義函數(shù)原型
int main(){}
  - main函數(shù)
void hello(char name[], int age){}
  - 自定義函數(shù)

指針

int age = 21;
int pAge = &age;
printf("address : %p", &age);
- &:地址操作符
- pAge:指針
  - 小寫p加變量首字母大寫Age

- %p:指針point
- 指針地址和內(nèi)存地址相同
- 變量age與指針*pAge值相同,類型也要求相同
- age=21的size是4byte,但是指針大小是8byte    // 21是兩個(gè)int整數(shù)

// 指針的初始化
int *pAge = NULL;    // 初始化成空指針
pAge = &age;

文件操作

FILE *pF = fopen("test.txt", "w");
  - *pF:文件指針
  - test.txt:文件位置
  - w:寫操作(覆蓋)
  - a:追加(不會(huì)覆蓋)
  - r:只讀
- 讀取文件時(shí)要加buffer
char buffer [255];
while(fgets(buffer, 255, pF) != NULL)
{
printf("%s", buffer);
}
- 沒有循環(huán)則只讀一行內(nèi)容
- 空指針則表示文件不存在

fprintf(pF, "hello world");
- 根據(jù)指針寫文本內(nèi)容
fclose(pF);    // 關(guān)閉文件
remove("test.txt")    // 刪除文件,0表示刪除成功
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容