概念
c語言是一種計算機語言 也就是人與計算機打交道的語言
在早期,因為計算機使用的二進制 所以早期寫代碼都是科學家來寫的使用對應的功能二進制代碼 需要用到手冊,所以開發不方便
在后來,人們發明了匯編語言 用於重命名相應的二進制代碼,使開發變得方便起來,但是隨着代碼量的增多,功能越來越臃腫 導致出現了B語言
而c語言正是在B語言基礎之上所搭建的高級計算機語言,類似的還有java/c++等
流行的原因
C語言早期出現並不是很成熟 隨着使用人數慢慢增加,c語言越來越完善,最后流行了起來,但是有一個問題 每個人或者每個公司都對c語言有過自定義的定制功能,導致在我這里編譯的能跑起來的程序,到您那就不行了
國際標准
為了解決這個情況,人們制定一個國家標准
ANSI C -> C89/C90
hello world
這里使用的開發軟件是 vs 2019
百度官網下載
安裝 c++庫即可總共4g
[[vs2019 初始化]]
創建項目
這里命名規則是test_年_月_日_第幾個文件
創建一個空的c++項目
新建文件,發現沒有以c為后綴的模板
直接新建test.c
輸入代碼:
//引用頭文件 std-標准 io-輸入輸出流 類似於java的庫 .h head 頭文件
#include <stdio.h>
//主函數--程序的入口 .c c語言源文件
int main() {
printf("hello world\n");
return 0;
}
按F5運行
控制台輸出hello world
vs 2019快捷鍵
ctrl+/
注解生成 設置
ctrl+k+d
格式化代碼
bit與字節與各種類型的關系
八個bit等於一個字節
c語言中的各種類型 與字節大小:
char 2
short 2 意思就是一個short可以占用十六個bit的空間 也就是 2^16-1 65535個數字
int 4
long 8
long long 16
float 4
double 8
主要定義類型還是看需求
地址的解釋和輸入流的使用
地址為某個對象存放在電腦內存中的獨有id,可直接查找到相應的值
//引用頭文件 std-標准 io-輸入輸出流 類似於java的庫 .h head 頭文件
#include <stdio.h>
//主函數--程序的入口 .c c語言源文件
int main() {
//printf("hello world\n");
//int a = 10;
//printf("%d\n", a+10);
//char c = 'A';
//printf("%c", c);
int num1 = 0;
int num2 = 0;
scanf_s("%d%d", &num1, &num2);
printf("%d", num1 + num2);
return 0;
}
scanf_s(要輸入的類型,...要賦值的對象的地址)
作用域與全局變量
與java類似
但是有個全局作用域,全局變量在整個項目中都可以使用
首先在源文件中定義sum.c
int g_num=2021;
再在main中使用
int main() {
extern int g_num;
printf("%d", g_num);
return 0;
}
要使用全局變量,首先變量名要相同,其次 在要使用的變量前面聲明extern
跨平台性的兼容
vs平台認為scanf函數並不安全 所以直接推出scanf_s函數,但是其他編譯平台沒有,這就導致了該程序只能在vs的平台上運行
所以這里只用使用scanf就好了,查看他報的錯誤,開啟配置
_CRT_SECURE_NO_WARNINGS
在文件的最上方輸入#define 配置名稱 數值
#define _CRT_SECURE_NO_WARNINGS 1
此時使用scanf函數不報錯即可運行
一勞永逸
^1b1801
每次創建文件都要加上#define _CRT_SECURE_NO_WARNINGS 1
是不是很惡心
所以有這樣種方式可以一勞永逸
打開所在位置
然后打開這個路徑
.\VC\VCProjectItems
找到newc++file.cpp
打開修改
保存
此時創建一個新的c時,默認帶入該代碼
各種常量
字面常量
1,2,3
這種都叫字母常量
常變量
使用const
關鍵詞修飾的的變量叫常變量
常變量不能作為下面舉例的方法中使用
標識符常量
常變量不能被修改 不然編譯會報錯
標識符常量
使用#define 定義的常量叫標識符常量,這種方式定義出來的數值就真的是常量了
使用案例
#define MAX 10
//引用頭文件 std-標准 io-輸入輸出流 類似於java的庫 .h head 頭文件
#include <stdio.h>
//主函數--程序的入口 .c c語言源文件
int main() {
int arr[MAX] = { 0 };
printf("%d", arr);
return 0;
}
這里注意下,使用define 定義不能加;
不然會報錯
枚舉
enum
定義 和使用 與java類似
代碼:
enum Sex {
MAN,
WOMAN,
SECRET
};
int main() {
printf("%d\n", MAN);//0
printf("%d\n", WOMAN);//1
printf("%d\n", SECRET);//2
enum Sex sex = SECRET;
printf("%d\n", sex);//2
return 0;
}
字符串
在c中
使用雙引號括起來的字符就叫字符串
這里使用兩種方式生成字符串,同時打印出來
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
char str[] = "abc";
char str2[] = { 'a',
'b',
'c',
//"\0"
};
printf("%s\n", str);//abc
printf("%s\n", str2);//abc 亂碼
return 0;
}
為什么會有亂碼呢?
調試可以發現 字符串必須以\0 或 0
結尾
此時我們加上,順便查看字符串長度
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main() {
char str[] = "abc";
char str2[] = { 'a',
'b',
'c',
"\0"
};
//printf("%s\n", str);
//printf("%s\n", str2);
printf("%d\n", strlen(str));
printf("%d\n", strlen(str2));
return 0;
}
發現值相同
轉義符
有些字符串想打出他本來的意思,可以使用轉義符
\
注釋
// c++風格的注釋
/*
c語言風格的注釋
*/
用處 可以解釋翻譯你寫的代碼
函數
定義
返回值類型 方法名(...類型 參數){
return 返回值;
}
作用
簡化方法的引用
數組
int a[] = { 1,2,3,4,5,6,7,8,9,1,2,3,4,6,7,8,9,11 };
數組長度獲取
int length = sizeof(a) / sizeof(a[0]);
sizeof(a) = 數組長度乘以該數組類型分配的字節
sizeof(a[0])=當前數組的類型的字節
相除得到數組長度
leecode算法題
獲取數組中沒有重復兩次的數據
比如1,2,3,4,5,1,2,3,4 要取到5
c寫法
int a[] = { 1,2,3,4,5,6,7,8,9,1,2,3,4,6,7,8,9,11 };
int length = sizeof(a) / sizeof(a[0]);
for (int i = 0; i < length; i++)
{
int count = 0;
for (int j = 0; j < length; j++)
{
if (a[i] == a[j]) {
count++;
}
}
if (count == 1) {
printf("%d\n", a[i]);
}
}
java寫法
//1
int[] arr={1,2,3,4,5,6,7,8,9,1,2,3,4,6,7,8,9,11};
List<Integer> countArr=new ArrayList<>();
for (int i : arr) {
if (!countArr.contains(i))
countArr.add(i);
else {
for (int i1 = 0; i1 < countArr.size(); i1++) {
if (countArr.get(i1)==i){
countArr.remove(i1);
}
}
};
}
System.out.println(countArr);
//2
int[] arr={1,2,3,4,5,6,7,8,9,1,2,3,4,6,7,8,9,11};
for (int k : arr) {
int count = 0;
for (int i : arr) {
if (i == k)
count++;
}
if (count == 1) {
System.out.println(k);
}
}
算法優化
這里是最優解
java
int[] arr={1,2,3,4,5,1,2,3,4};
int ret=0;
for (int i : arr) {
//0^任何一個數 等於任何一個數 任何一個數^任何一個數等於0 由此可以判斷 ^可以打亂順序,結果不會變
// 同時可以排除掉有兩對的數據 但是這種算法不可找到第二個排除的
ret=ret^i;
}
System.out.println(ret);
轉換成c
int arr[] = { 1,2,3,4,5,1,2,3,4 };
int length = sizeof arr / sizeof arr[0];
int ret = 0;
for (int i=0; i < length;i++) {
ret = ret ^ arr[i];
}
printf("%d", ret);