C語言日記① 初識C


概念

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);

下一篇筆記


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM