IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c语言零基础学习日记 -> 正文阅读

[C++知识库]c语言零基础学习日记

原码、反码、补码

负数在内存中存储的时候,存储的是二进制的补码

使用、打印的时候是这个数的原码

只要是整数,内存中存储的都是二进制的补码

正数--原码,反码,补码相同

负数--

//-2? 第一位为符号位,都是

//1000000000000000000010? --? 原码

//1111111111111111111101? --? 反码

//1111111111111111111110? --? 补码

//后置++,先使用变量的值,再++???? 原变量值改变,赋值的为原变量

//前置++,先++,再使用a的值 ??????原变量值改变,赋值的为新变量

int main()
{
??? int a = 10;
??? //int b = a++;//输出为11,10
??? int b = ++a;//输出为11,11
??? printf("%d %d\n", a, b);
??? return? 0;
}

关系操作符

?> ????>=??? <??? <=???

!=? ? ? --? 用于测试“不相等”

==? ? ?--? 用于测试“相等”

逻辑操作符

&&? --? 逻辑与 ?有0则结果为0

||? --? 逻辑或 ?有1则结果为1??? //判断左右数字的真假,结果只有0或1

条件操作符

exp1 ? exp2 : exp3;?? //max = (a > b ? a : b);? a是否大于b,真则输出a,假则输出b

逗号表达式

exp1, exp2, exp3, …expn

下标引用、函数调用和结构成员

[]??? ()??? .??? ->

常见关键字

auto -- auto int//一般都省略 ?break?? case? char?? const? continue? default? do? double? else? enum? extern? float? for? goto? if? int? long? register int a = 10;//建议把a放进寄存器中 ?return? short? signed int a = -2;//定义的变量是有符号的 ?sizeof? static? struct/*结构体关键字*/? switch? typedef? union/*联合体/共用体*/? unsigned? void? volatile? while?

typedef? --? 类型定义 ?--? 类型重定义

typedef unsigned int u_int//将unsigned int重新定义为u_int,二者的数据类型完全相同

static? --? 修饰局部变量 ?--? 局部变量的生命周期变长

??????? -- ?修饰全局变量 ?--? 改变了变量的作用域(静态的全局变量之能在自己所在的源文件内部使用)

??????? --? 修饰函数 ?????--? 改变了函数的链接属性(可以在同一个程序中声明后使)

void test()
{
??? static int a = 1;
??? a++;
??? printf("%d\n", a);
}
int main()
{
??? int i = 0;
??? while (i<5)
??? {
??????? test();
??????? i++;
??? }
??? return 0;
}

//extern -- 用于申明外部符号

extern int ……(其他文件中的全局变量

#define定义常量和宏

#define MAX 100

//#define定义标识符常亮

//#define可以定义宏-带参数

int Max(int x, int y)
{
??? if (x > y)
??????? return x;
??? else
??????? return y;?
}

//宏的定义

#define Max(X,Y) (X>Y?X:Y)
???????int main()
{
??? int a = 10;
??? int b = 20;
??? int max = Max(a, b);
??? printf("%d\n", max);
??? //宏的方式
??? max = Max(a, b);
??? printf("%d\n", max);
??? return 0;
}

可以看出,用宏定义函数只需要一行,比原来的函数定义方式要简单一些,实现起来更加简洁

指针

内存:如何产生地址:32位 -- 32根地址线/数据线 -- 正电和负电 -- 1/0

int main()
{
??? int a = 10;//4个字节
??? int* p = &a;//取地址
??? printf("%p\n", &a);
??? printf("%p\n", p);
??? *p = 20;//解引用操作符-找到p所在的地址,将其值改为20
??? //一种用来存放地址的变量-指针变量
??? return 0;
}
int main()
{
??? char ch = 'w';
??? char* p = &ch;
}

p前的数据类型要根据使用的数据类型而改变

指针大小在32位平台是4个字节,64位平台是8个字节

分支语句和循环语句

分支语句? ? ? ? ? ? ? ? 循环语句? ? ? ? ? ? ? ? ? ?goto语句

if? ? ? ? ? ? ? ? ? ? ? ? ? ? ?while

switch? ? ? ? ? ? ? ? ? ? ?for

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?do while

if语句

语法结构:

if(表达式)

??? 语句;

if(表达式)

??? 语句1;

else

??? 语句2;

//多分支

if(表达式1)

??? 语句;

else if(表达式2)

??? 语句;

else(表达式3)

??? 语句;

int main()
{
??? int age ;
??? scanf("%d", &age);
??? if (age<18)
??? {
??????? printf("未成年");
??? }
??? else
??? {
??????? printf("已成年");
??? }
??? return 0;
}

如果条件成立,要执行多条语句;应该怎样使用代码块

#include<stdio.h>
#include<string.h>
int main()
{
??? int age ;
??? scanf("%d", &age);
??? if (age<18)
??? {
??????? printf("未成年");
??? }
??? else
??? {
??????? printf("已成年");
??? }
??? return 0;
}

{}就代表一个代码块

悬空else

???????int main()
{
??? int a = 0;
??? int b = 2;
??? if (a == 1)
??????? if (b == 2)
??????????? printf("hehe\n");
??? else
??????? printf("haha\n");
??? return 0;
}

else和最近的if进行匹配,和谁对齐没有关系

代码书写形式的对比

//代码1

if (condition) 
{
??? return x;
}
return y;

//该语句正确,如果执行if,返回x,如果不执行,返回y

//代码2

if (condition)
{
??? return x;
}
else
{
??? return y;
}

//该语句正确,如果执行if,返回x,如果不执行,返回y

//代码3

int num = 4;
if (num = 5)
{
??? printf("hehe\n");
}
return 0;

//此处也能输出hehe,这是由于num被赋值了

代码的书写习惯:在执行判断语句时要反过来写 -- 5 == x? //常量放在变量的左边

//这样即使产生了漏打=的情况也会无法编译从而发现错误

switch语句

分支语句,常常用于多分支的情况 ?--? 必须使用整型

比如:? 输入1,输出星期一;

??????? 输入2,输出星期二;

??????? 输入3,输出星期二;

switch (整形表达式)

{

??? 语句项;

}

int main()
{
??? int day = 0;
??? scanf("%d", &day);
??? switch (day)
??? {
??? case 1:
??????? printf("星期一\n");
??????? break;
??? case 2:
??????? printf("星期二\n");
??????? break;
??? case 3:
??????? printf("星期三\n");
??????? break;
??? case 4:
??????? printf("星期四\n");
??????? break;
??? case 5:
??????? printf("星期五\n");
??????? break;
??? case 6:
??????? printf("星期六\n");
??????? break;
??? case 7:
??????? printf("星期天\n");
??????? break;
??? }
??? return 0;
}

case后的输入决定从哪个阶段进入,break决定从哪个地方中止

???????int main()
{
??? int day = 0;
??? scanf("%d", &day);
??? switch (day)
??? {
??? case 1:
??? case 2:
??? case 3:
??? case 4:
??? case 5:
??????? printf("工作日\n");
??????? break;
??? case 6:
??? case 7:
??????? printf("休息日\n");
??????? break;
??? }
??? return 0;
}

相同输出可以没有break

如果输入的不在可输出范围内:

??? default:
??????? printf("输入错误\n");
??????? break;

循环语句

break跳出循环 ????continue到这一行中止本次循环返回最初的循环判断部分

???????int main()
{
??? int ch = 0;
??? while ((ch = getchar()) != EOF)
??????? putchar(ch);
??? //每次输入的字符getchar被赋值到ch上,然后输出刚才输入的字符
??? //输入ctrl+z中止这个循环
??? return 0;
}
int main()
{
??? int ret = 0;
??? char password[20] = { 0 };
??? printf("请输入密码");
??? scanf("%s", password);
??? printf("请确认(Y/N):>");
??? ret = getchar();
??? if (ret=='Y')
??? {
??????? printf("确认成功\n");
??? }
??? else
??? {
??????? printf("放弃确认\n");
??? }
??? return 0;
}

在缓冲区中输入的内容是123456\n

123456被存储到password中,\n存储到ret中,所以这里ret的值为10(转义字符\n的十进制)自动进行下一步if语句

这个时候就要让\n在进行到下一步之前被取走

??? char password[20] = { 0 };
??? printf("请输入密码");
??? scanf("%s", password);
??? getchar();//用于取走缓冲区剩下的\n
??? printf("请确认(Y/N):>");

这个时候发现读取完123456以后getchar读取了剩下的ABCD然后又剩下了\n

写一个循环让代码把缓冲区内的字符都读完再进行下一步

??? while ((ch = getchar()) != '\n')
??? {
??????? ;
??? }

int main()
{
??? int ch = 0;
??? while ((ch = getchar()) != EOF)
??? {
??????? if (ch<'0' || ch>'9')
??????????? continue;
??????? putchar(ch);
??? }
??? return 0;
}

复制出输入的字符,不输出其他的字符如英文字符

for循环

for(表达式1;表达式2;表达式3)

??? 语句;

和while中使用continue会造成死循环不同,for只要执行了,就算continue后的语句没有执行,同样继续for后括号内的部分

一些建议:

  1. 不可以在for循环体内修改循环变量,防止for循环失去控制
  2. 建议for语句的循环控制变量的取值采用“前闭后开区间”写法

一些for循环的变种

  1. for循环的初始化、调整、判断都可以省略。但是:for循环的判断部分被省略,将会陷入死循环
  2. 如果不是非常熟练,不建议省略
int main()
{
//变种1
for (;;)
{
???? printf("hehe\n");//死循环
}
}

int main()
{
??? for (int i = 0; i < 10; i++)
??? {
??????? for (int j = 0;j < 10;j++)
??????? {
??????????? printf("hehe\n");
??????? }
??? }//打印出100个呵呵
??? return 0;
}

int main()
{
??? int i = 0;
??? int j = 0;
??? for (; i < 10; i++)
??? {
??????? for (;j < 10;j++)
??????? {
??????????? printf("hehe\n");
??????? }
??? }//打印出10个hehe
??? return 0;
}

//变种2
int main()
{
??????? int x, y;
??? for (x = 0, y = 0; x < 2 && y < 5; ++x, y++)
??? {
??????? printf("hehe\n");
??? }
??? return 0;
}

//请问循环要循环多少次?
#include <stdio.h>
int main()
{
??? int i = 0;
??? int k = 0;
??? for (i = 0, k = 0; k = 0; i++, k++)
??????? k++;//for的判断部分变为了对k赋值,赋值为0,为假,不进行循环
??? return 0;
}

dowhile()循环

do语句的语法:

do

??? 循环语句;

while (表达式);

int main()
{
??? int i = 1;
??? do
??? {
??????? printf("%d ", i);
??????? i++;
??? } while (i <= 10);//最后打印出1-10
??? return 0;
}

二分查找

假设一个有序数组中有n个元素,遍历查询中最坏的情况需要查找n次,二分查找/折半查找将会大大减少计算冗余

int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,11 };
	int k;
	scanf("%d", &k);
	int sz = sizeof arr / sizeof arr[0];
	int left = 0;
	int right = sz-1;
	while (left<=right)
	{
		int mid = (left + right) / 2;
		if (k>arr[mid])
		{
			left = mid+1;//这里不可以用mid++,但是可以用+=mid和++mid
		}
		else if (k<arr[mid])
		{
			right = mid-1;//这里不可以用mid--,但是可以用-=mid和--mid
		}
		else
		{
			printf("找到了,下标是%d", mid);
			break;
		}
	}
	if (left>right)
	{
		printf("没有这个数");
	}
	return 0;
}

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 10:54:41  更:2022-09-13 10:57:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 13:30:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码