日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C++與C語言常用的語法對比_C 語言

作者:淺若清風cyf? ? 更新時間: 2022-06-16 編程語言

前言

本人在校學習的第一門語言是C++,由于操作系統這門課程實驗的需要,要求在linux下使用GCC編譯器編譯C程序代碼,為了寫代碼的方便,本人先采用VS2017寫了C++版本的代碼,再根據C++和C語言兩個語法的不同將程序進行修改成C程序。由于本人沒有學過C語言,對C語言的語法也不是很熟悉,寫本文的目的是記錄下修改過程的遇到的幾個注意點,方面以后參考,

1.頭文件

c++

#include <iostream>
#include <ctime>
#include <stdlib.h>
#include <random>

C

#include <time.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/msg.h>
#include <sys/ipc.h>
#include <sys/wait.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdbool.h>
#include <malloc.h>

注:以上兩種語言的頭文件沒有給出直接對應的關系,在使用時若不知道需要哪些頭文件可以直接全部復制使用。

2.結構體struct

C++?說明:?C++的struct成員包含成員函數

struct Hello{
	void sayHello(char *name){
		printf("你好,%s\n",name);
	}
};

int main()
{
	Hello hello;
	hello.sayHello();
	exit(0);
}

C?說明:?C語言的struct的成員只能是數據,不支持函數,因此若要定義結構體的函數需要使用函數指針實現

struct Hello{
	void (*sayHello)(char* name);   //函數名為指針類型
};
void sayHello(char* name){
	printf("你好,%s\n",name);
}
int main(){
	struct Hello hello;  //聲明結構體的變量,需要加struct
	hello.sayHello=sayHello;  //C語言需要使用函數指針指向函數的聲明?。。?
	hello.sayHello("淺若清風");
	return 0;
}

3.動態數組的創建與刪除

以一維和二維動態數組為例: C++?創建:?C++使用new自動為動態數組分配空間?刪除:?C++使用delete為動態數組釋放內存

void f()
{
	int n;
	int m;
	int *Array1;  //聲明一維動態數組
	Array1=new int(n);  //為一維動態數組分配空間,元素個數為n
	int **Array2;  //聲明二維動態數組
	Array2=new int*[n];  //為二維動態數組分配空間(n個指針空間),n行
	for(int i;i<n;++i)
	{
		Array2[i]=new int[m];  //為每一行分配內存空間(m個整數空間),m列
	}
	//釋放內存
	delete []Array1;
	for(int i=0;i<n;++i){
		delete[]Array2[i];
	}
	delete[]Array2;
}

C?創建:?C使用calloc為動態數組分配空間?刪除:?C使用free()為動態數組釋放內存

void f()
{
	int n;
	int m;
	int *Array1;  //聲明一維動態數組
	Array1=(int *)calloc(n,sizeof(int));  //為一維動態數組分配空間,元素個數為n
	int **Array2;  //聲明二維動態數組
	Array2=(int **)calloc(n,sizeof(int*));  //為二維動態數組分配空間(n個指針空間),n行
	for(int i;i<n;++i)
	{
		Array2[i]=(int*)calloc(m,sizeof(int));  //為每一行分配內存空間(m個整數空間),m列
	}
	//釋放內存
	free(Array1);
	for(int i=0;i<n;++i){
		free(Array2[i]);
	}
	free(Array2);
}

malloc函數與calloc函數的區別:

  • malloc函數:不能初始化所分配的內存空間,在動態分配完內存后,里邊數據是隨機的垃圾數據。
  • calloc函數:能初始化所分配的內存空間,在動態分配完內存后,自動初始化該內存空間為零。

4.函數順序問題

  • C++中,寫在前面的函數可以直接調用寫在后面的函數
  • C中,被調用的函數需要寫在調用函數之前

5.類(class)

類是C++引入的類型,可以包含數據,也可以包含函數,解決了C語言struct只能包含數據的缺陷。 另外一個不同點是struct是默認public,而class默認private

  • 下面以一個鏈隊的例子,來體現C++的 class的用法,并與C語言用struct實現進行對比

C++

#include<iostream>
using namespace std;

class QueueNode  //隊列結點
{
public:
	QueueNode() :page(-1), next(NULL) {};
	QueueNode(int m_page, QueueNode* m_next = NULL) :page(m_page), next(m_next) {};
	~QueueNode() { next = NULL; }
public:
	int page;
	QueueNode* next;  //儲存下一個結點的指針
};

class LinkQueue  //隊列
{
public:
	LinkQueue() { front = rear = new QueueNode(); count = 0; }
	void push(int m_page);  //加到隊尾
	int pop();  //取出隊首結點(此例是包含頭指針的鏈隊,頭指針的下一個結點才是隊首結點),并返回該結點值
	bool exist(int page);  //判斷隊列中是否有結點的值為page
	void print(int page);  //打印隊列

	QueueNode* front;  //隊首指針
	QueueNode* rear;  //隊尾指針
	int count;  //統計結點數量
};

void LinkQueue::push(int m_page)
{
	QueueNode* p = new QueueNode(m_page);
	p->next = NULL;
	rear->next = p;
	rear = p;
	count++;
}

int LinkQueue::pop()
{
	if (front == rear) {
		printf("隊列為空!\n");
		return 0;
	}
	int top = front->next->page;  //記錄隊首,作為返回值
	QueueNode* tmp = front->next;
	front->next = tmp->next;
	if (rear == tmp)  //只剩下一個元素,此題不會出現這種情況
	{
		rear = front;
	}
	delete tmp;
	count--;
	return top;
}

void LinkQueue::print()  //打印隊列
{
	QueueNode* p = front;
	while (p->next != NULL)
	{
			printf("%d ", p->next->page);
			p = p->next;
	}
	printf("\n");
}

bool LinkQueue::exist(int page) {  //判斷隊列中是否存在元素page
	QueueNode*p = front;
	while (p->next != NULL) {
		if (p->next->page == page) {
			return true;
		}
		else {
			p = p->next;
		}
	}
	return false;
}

int main()
{
	LinkQueue queue;
	for(int i=0;i<5;++i)
	{
		queue.push(i);
	}
	queue.print();
	if(queue.exit(6)) printf("yes!\n");
	else printf("no!\n");
	int top=queue.pop();  //獲得隊首元素值
	printf("隊首元素的值為%d\n",top);
}
# include<stdio.h>
# include<stdlib.h>
# include<stdbool.h>

struct QueueNode
{
	int page;
	struct QueueNode *next;
};

typedef struct LinkQueue {
	struct QueueNode* front;
	struct QueueNode* rear;
	int count;
};

void initQueue(struct LinkQueue *q)
{
	q->front = q->rear=(struct QueueNode *)malloc(sizeof(struct QueueNode));
	q->front->next = NULL;
	q->count=0;
}

void push(struct LinkQueue *q, int page)
{
	struct QueueNode* node = (struct QueueNode*)malloc(sizeof(struct QueueNode));
	node->next = NULL;
	node->page = page;
	q->rear->next = node;  //與新增結點鏈接
	q->rear=node;  //尾指針后移
	q->count++;
}

int pop(struct LinkQueue*q)  //隊首元素出隊,并返回數值
{
	int top = q->front->next->page;
	struct QueueNode *node = q->front->next;
	q->front->next = q->front->next->next;
	free(node);
	return top;
}

bool exist(struct LinkQueue*q, int page)  //判斷隊列是否有結點的值等于page
{
	struct QueueNode *node = q->front;
	while (node->next != NULL)
	{
		if (node->next->page == page) return true;
		else node = node->next;
	}
	return false;
}

void print(struct LinkQueue *q)
{	
	struct QueueNode *node =q->front;
	while (node->next != NULL)
	{
		printf("%d ", node->next->page);
		node = node->next;
	}
	printf("\n");
}

int main()
{
	struct LinkQueue queue;
	initQueue(&queue);
	for (int i = 1; i < 5; ++i)
	{
		push(&queue, i);
	}
	print(&queue);
	if (exist(&queue, 3)) printf("yes!\n");
	printf("======\n");
	if (exist(&queue, 6)) printf("yes!\n");
	else printf("no!\n");
	int top = pop(&queue);
	printf("隊首元素的值為%d\n", top);
}

原文鏈接:https://juejin.cn/post/7085332375613210637

欄目分類
最近更新