C语言笔记:类型、运算符与表达式

类型与变量

概念

类型是定义变量的,什么是类型,例如张三是一个人,张三就是变量而人就是类型,什么是变量就是用来存储数据的,为什么变量会分为很多类型,因为存储的数据类型不同,需要不容的类型来定义变量好让计算机识别。

代码带入

#include <stdio.h>

int main() {
    //人 张三
    int a;
    return 0;
}

在上面的代码中int就是类型,a就是变量。

常用的数据类型

ASCII码表

输入输出函数

输出函数

实际代码展示
printf用法

#include <stdio.h>

int main() {
    //用int类型 定义 n1, n2两个变量
    int n1, n2;
    //返回值不懂没关系,下面这句代码的意思就是n1 接收了printf这个函数的返回值
    //n1 接收返回值,printf打印hello world\n, '\n'是一个字符,在ASCII码表上有,而计算机识别到打印出来就是换行
    n1 = printf("hello world\n");
    //打印换行符的ASCII码值
    printf("%d\n", '\n');
    int a = 123;
    //%d是占位符,就是为变量a占用一个位置,来打印变量a里存储的值
    //不同类型的变量,占位符是不同的
    n2 = printf("hello world : %d\n", a);
    //打印上面两个用printf打印后的返回值n1, n2的大小
    printf("n1 = %d, n2 = %d\n", n1, n2);
    return 0;
}

结果显示:

sprintf用法
#include <stdio.h>

int main() {
    //定义一个char类型的数组,大小为可以存值100个字符,而 = {0}是什么意思,初始化这个数组;
    //为什么要初始化,因为创建数组他是从内存中选取一段连续未使用的内存,而选中的内存可能会有残余的垃圾,所以需要初始话一下
    //可以尝试一下不初始化,直接输出这个数据会是怎么样
    char str[100] = {0};
    //输出字符数组可以用%s这个占位符
    printf("str = %s\n", str);
    //
    char a = 'A', b = 'B', c = 'C';
    //将变量a, b, c,输入进str字符数组;
    //大概理解就是,原本printf函数是将输出的内容打印在终端屏幕上,而sprintf是将输出的内容输出到str字符串中
    //理解不了没有太大关系,现在的阶段只要会用就可以
    sprintf(str, "%c%c%c", a, b, c);
    //再次输出str字符数组
    printf("str = %s\n", str);
    return 0;
}

结果显示:

输入函数

代码实际演示
scanf的用法
#include<stdio.h>

int main() {
    //定义
    int a, b, n;
    //输出提示信息,提示你该输入a,b需要读入的值了
    printf("normal scanf, input a, b: ");
    //%d整形格式占位符中间可以不加空格
    //如果代码成功运行那个scanf就成功读取两个参数也就是a和b,那么n的值就应该为2,因为scanf的返回值为成功读取参数的个数
    //对于&符合,现在记着使用scanf时就得使用就可以,在后续的会讲到这个符号是什么作用
    n = scanf("%d%d", &a, &b);
    printf("a = %d, b = %d\n", a, b);
    printf("n = %d\n", n);
    printf("normal scanf, input %%dabc%%d: ");
    //你如果输入的数据为123abc456那么, a, b的值分别为123, 456, 而'abc'被scanf的格式化吞掉了
    //而返回值n的值为2,因为成功读入的参数还是只有a,b两个
    n = scanf("%dabc%d", &a, &b);
    printf("a = %d, b= %d\n", a, b);
    printf("n = %d\n", n);
    return 0;
}

最终效果:

这里12 14中间要加空格,不然计算机以为1214就是一个数字就读取到变量a中,b就还没有值就还需要在继续输入

 补充:利用scanf读入带空格的字符串

#include<stdio.h>


int main() {
    //创建str字符数组并初始化
    char str[100] = {0};
    //[]是字符匹配集,意思就是在[]中含有的内容将会读取,反之则不
    //^这个字符的意思是非,那么[^\n]的意思就是除\n这个字符以外的都读取
    //这里没有用到&,就先记住读取字符数组不用加&这个符号
    scanf("%[^\n]s", str);
    printf("str = %s\n", str);
    return 0;
}

最终效果:

sscanf的用法
#include<stdio.h>

int main() {
    int a, b;
    //定义一个字符数组,并赋值;
    char str[100] = "123abc456";
    //变量a, b从str字符数组中读取值
    //sscanf读入str字符数组中的内容就相当于scanf读取在终端上输入的内容
    sscanf(str, "%dabc%d", &a, &b);
    printf("a = %d, b = %d\n", a, b);
    return 0;
}

最终效果:

基本运算符

基本运算符的代码实现

#include <stdio.h>

int main() {
    //定义三个变量
    // a = 5就是赋值运算符的用法
    int a = 5, b = 2, c = 10;
    printf("a = %d, b = %d, c = %d\n", a, b, c);
    // a = b也是,可以用一个变量去赋值另一个变量
    int s = b;
    printf("s = %d\n", s);
    // + - * 运算符
    printf("a + b = %d\n", a + b);
    printf("c - b = %d\n", c - b);
    printf("a * b = %d\n", a * b);
    // / 运算符
    // 这里c / b是可以整除那么得出的值为5
    printf("c / b = %d\n", c / b);
    // 这里a / b是无法整除的,那么这里有个规则就是向0取整,就是2
    printf("a / b = %d\n", a / b);
    // 这里d / b 也是无法整除的,那么他向0取整就是-2
    int d = -5;
    printf("d / b = %d\n", d / b);
    //运算符还可以吧运算后的结果去赋值变量也是可以的
    int n = a + b;
    printf("n = a + b = %d\n", n);
    // % 取余运算
    // 这里如果需要用printf打印%这个符号就需要用%%
    printf("a %% b = %d\n", a % b);
    return 0;
}

最终效果:

位运算

        这里会用到关于二进制的知识,所以需要提前了解二进制:二进制

&(按位与运算)

        这里的&和scanf中的&是同一个符号,但是作用是完全不同的,所以需要区分一下;如图是如何计算的:

        

|(按位或运算)

        如图如何计算:

^(异或)

~(按位取反)

>>(右移)

<<(左移)

代码实际演示

代码看着很长,但是很简单,因为每个运算符都有实际的代码演示

#include<stdio.h>

//这里的代码先不用去理解,在学习循环后可以再回头来看
//这里的代码作用就是把数字以二进制形式显示出来
void printf_digit(int x) {
    for (int i = 31; i >= 0; i--) {
        printf("%c", (x & (1 << i)) ? '1' : '0');
    }
    printf("\n");
    return ;
}


int main() {
    int a = 5, b = 3;
    //输出a和b的二进制形式
    printf("a = "); printf_digit(a);
    printf("b = "); printf_digit(b);
    //与运算和或运算
    printf("a & b = "); printf_digit(a & b);
    printf("a | b = "); printf_digit(a | b);
    //异或
    printf("a ^ b"); printf_digit(a ^ b);
    printf("a = %d, b = %d\n", a, b);
    //如何不用第三个变量交换a, b变量中的值
    a ^=  b;//这句代码的意思就是a = a ^ b,同理 a += b,就是 a = a + b;需要两个变量的运算符都可以这样
    b ^=  a;
    a ^=  b;
    //这3句代码,可以在纸上自己画一下这个过程,看是否能交换值
    printf("a = %d, b = %d\n", a, b);
    //按位取反
    printf("~a = "); printf_digit(~a);
    //然后下面是看负数是不是通过正数按位取反在+1得到的
    printf("a = %d\n", a);
    printf("(~a + 1) = %d\n", ~a + 1); 
    //下面是一个练习,如何取得一个数在二进制中最后一位一,也就是从右往左的一个1;
    int x;
    scanf("%d", &x);
    printf("x = "); printf_digit(x);
    printf("(-x & x) = "); printf_digit(-x & x);
    //左移右移
    int c = 123456767, e = -c;
    printf("c = "); printf_digit(c);
    printf("e = "); printf_digit(e);
    //c左移一位
    printf("c << 1 = "); printf_digit(c << 1);
    //c右移一位
    printf("c >> 1 = "); printf_digit(c >> 1);
    //e左移一位
    printf("e << 1 = "); printf_digit(e << 1);
    //e右移一位
    printf("e >> 1 = "); printf_digit(e >> 1);
    //左移等于这个变量乘以2的结果
    printf("c = %d, c << 1 = %d, c / 2 = %d\n", c, c << 1, c * 2);
    //右移等于这个变量除以2的结果
    //但是/ 是向0取证,但是>>是向下取证
    //向下取证就是5 >> 1 = 2,正数和/是没有区别的
    //但是负数-5 >> 1 = -3,而-5 / 2 = -2区别在这儿
    //所以向下取整的意思就是向小的一端去取证
    printf("c = %d, c >> 1 = %d, c / 2 = %d\n", c, c >> 1, c / 2);
    return 0;
}

最终效果:

运算符优先级

        如何理解优先级,就是先计算高优先级的运算符,如果优先级一样,看结合性是从左到右,还是右到左的;这个需要自己多使用就能记住了,死记硬背的效果永远没有实际操作的效果来的更快;

常用的数学函数

代码演示
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main() {
    //double 用%lf展位符,int 用%d占位符
    printf("pow(2, 3) = %lf\n", pow(2.0, 3.0));
    printf("sqrt(2) = %lf\n", sqrt(2));
    printf("ceil(4.1) = %lf\n", ceil(4.1));
    printf("floor(4.9) =  %lf\n", floor(4.9));
    printf("abs(-9) = %d\n", abs(-9));
    printf("fabs(-4.56) = %lf\n", fabs(-4.56));
    printf("acos(-1) = %lf\n", acos(-1));
    return 0;
}

最终效果:

章节小结:

        学完了知识点一定要自己去做题,如果有疑问先带着疑问先去尝试写代码,看自己的想法是否能实现,如果实在想不明白再回头来问老师,这样不仅解决了问题,还加深了你对知识点的记忆。开始是会觉得哪里都不懂,但是慢慢的往后学习,回头来看之前学过的内容你就会发现原来这么简单,直接顿悟。

        加油相信自己,你是最NB的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/447066.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LVS集群(Linux Virtual server)

集群概念lvs模型lvs调度算法lvs实现lvs高可用性&#xff0c;负载均衡 1 集群和分布式 系统性能扩展方式&#xff1a; Scale UP&#xff1a;垂直扩展&#xff0c;向上扩展,增强&#xff0c;性能更强的计算机运行同样的服务 升级单机的硬件设备Scale Out&#xff1a;水平扩展…

C++的一些基础语法

前言&#xff1a; 本篇将结束c的一些基础的语法&#xff0c;方便在以后的博客中出现&#xff0c;后续的一些语法将在涉及到其它的内容需要用到的时候具体展开介绍&#xff1b;其次&#xff0c;我们需要知道c是建立在c的基础上的&#xff0c;所以c的大部分语法都能用在c上。 1.…

妇女节:打开AI视界,成就“她力量”

根据国内招聘平台猎聘发布的《2024女性人才数据洞察报告》&#xff0c;从2023年3月到2024年2月&#xff0c;女性在AIGC领域的求职人次同比增长了190.49%。随着人工智能时代的降临&#xff0c;女性正以前所未有的姿态&#xff0c;在技术的助力下&#xff0c;蜕变成为新生的力量。…

STM32电源及时钟介绍

一、STM32最小系统 二、电源电路 2.1供电电压VDD&#xff0c;VSS F103VET6 的引角图 在 F103VET6 的引角图中可找到 49\50 角&#xff0c; 74\75 角&#xff0c; 99\100 角&#xff0c; 27\28角&#xff0c;10 \11角一共 5 对的VDD&#xff0c;VSS&#xff0c;也就是给我们芯片…

鸿蒙开发学习入门教程之环境配置

最近鸿蒙开发越来越火&#xff0c;各个大厂都有鸿蒙版本的计划和宣传&#xff0c;看这个趋势&#xff0c;可能会在几年内发展壮大&#xff0c;为我们移动端码农开辟一片新的职场。所以现在开始学起来还是很有必要的。今天就一起开始配置环境搞起来吧。 首先&#xff0c;找到官…

高级语言讲义2010软专(仅高级语言部分)

1.编写一程序&#xff0c;对输入的正整数&#xff0c;求他的约数和。 如&#xff1a;18的约数和为1236939 #include <stdio.h>int getsum(int n){int i,sum0;for(i1;i<n;i)if(n%i0)sumi;return sum; } int main(){int sum getsum(18);printf("%d",sum); …

ERP实施顾问面试题目

02什么是BOM和ECN&#xff1f;它们的完整英文拼写是什么&#xff1f;什么是替代料&#xff1f;&#xff08;10分&#xff09; BOM物料清单是英文Bill of Material的简写&#xff1b;ECN工程变更通知单是英文Engineering Change Notice的简写&#xff1b;替代料&#xff1a;由于…

CPP编程-CPP11中的内存管理策略模型与名称空间管理探幽(时隔一年,再谈C++抽象内存模型)

CPP编程-CPP11中的内存管理策略模型与名称空间管理探幽 CPP的四大内存分区模型 在 C 中&#xff0c;**内存分区是一种模型&#xff0c;用于描述程序运行时内存的逻辑组织方式&#xff0c;但在底层操作系统中&#xff0c;并不存在严格意义上的内存分区。**操作系统通常将内存分…

08 数据结构之查找-Hash、二分、顺序

引言&#xff1a; 实现链式哈希的代码 /* 质数&#xff1a; 对于大于1的正自然数&#xff0c; 处理1和它本身别的数都无法整除它&#xff0c; 这个数就是质数 hash函数的确定&#xff1a; α(质量因子) 0.7-0.8比较合适 m&#xff1a;存储数据的真实个数 n&#xff1a;存储空…

H264解码器实现-帧间预测

前言 本文所说的帧间预测是指根据当前预测块的MV向量和预测所需的参考块数据&#xff0c;计算出当前预测块的预测像素值的过程。该过程得到的预测像素值经过运动补偿后&#xff08;与反变换量化之后得到的残差像素值相加&#xff09;可以得到滤波前的重建像素值。 原理说明 …

<Linux> 初识线程

目录 前言&#xff1a; 一、什么是线程 &#xff08;一&#xff09;基本概念 &#xff08;二&#xff09;线程理解 &#xff08;三&#xff09;线程与进程的关系 &#xff08;四&#xff09;简单实用线程 &#xff08;五&#xff09;重谈虚拟地址空间 1. 页表的大小 2…

ARMv8/ARMv9架构入门到精通-学习方法

目录 1、学习ARM基础知识2、学习ARM异常(中断)3、学习MMU4、学习Cache5、学习Trustzone和安全架构6、学习ARM架构和各类IP推荐 本文转自 周贺贺&#xff0c;baron&#xff0c;代码改变世界ctw&#xff0c;Arm精选&#xff0c; 资深安全架构专家&#xff0c;11年手机安全/SOC底层…

WorldView卫星遥感影像数据/米级分辨率遥感影像

目前世界上最常用的高分辨率卫星影像莫过于WORLDVIEW系列了&#xff0c;在卫星遥感圈内可谓大名鼎鼎&#xff0c;不仅具有超高的分辨率还具有其他高分辨卫星所不具有的8波段&#xff0c;风光无限。在分辨率方面目前只有WORLDVIEW3和WORLDVIEW4能够达到0.3米的分辨率&#xff0c…

【神经网络与深度学习】LSTM(Long Short-Term Memory)神经网络模型

概述 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;结构&#xff0c;通常被用于处理和学习时间序列数据。因此&#xff0c;LSTM属于深度学习领域中的一种神经网络模型。 在深度学习中&#xff0c;LSTM被广泛应用于…

站库分离技术--反向代理技术-雷池云WAF-给自己搭建一个安全点的网站

文章目录 概要整体架构流程技术名词解释技术细节ssh-ubuntu服务器docker-映射-链接-通信nginx反代mysql设置数据库新密码 小结我的mysql映射目录我的wordpress映射目录 成果展示 概要 新买了一个云服务器&#xff0c;想搭建一个站库分离的wordpress为主的网站&#xff0c;采用d…

数据结构:图及相关算法讲解

图 1.图的基本概念2. 图的存储结构2.1邻接矩阵2.2邻接表2.3两种实现的比较 3.图的遍历3.1 图的广度优先遍历3.2 图的深度优先遍历 4.最小生成树4.1 Kruskal算法4.2 Prim算法4.3 两个算法比较 5.最短路径5.1两个抽象存储5.2单源最短路径--Dijkstra算法5.3单源最短路径--Bellman-…

CentOS 7安装MySQL及常见问题与解决方案(含JDBC示例与错误处理)

引言 MySQL是一个流行的开源关系型数据库管理系统&#xff0c;广泛应用于各种业务场景。在CentOS 7上安装MySQL后&#xff0c;我们通常需要使用JDBC&#xff08;Java Database Connectivity&#xff09;连接MySQL进行后端操作。 目录 引言 CentOS 7安装MySQL 使用JDBC连接My…

AI入门笔记(四)

深度学习是人工智能的一种实现方法。本文我将学习到的关于深度学习的代表卷积神经网络的数学结构分享给大家。 深度学习是重叠了很多层的隐藏层&#xff08;中间层&#xff09;的神经网络。我们以一个例题为例。 建立一个卷积神经网络&#xff0c;用来识别通过 66 像素的图像读…

基于VSCode安装Node.js开发环境

根据官网介绍&#xff0c;Node.js 是一个免费的、开源的、跨平台的JavaScript实时运行环境&#xff0c;允许开发人员在浏览器之外编写命令行工具和服务器端脚本. Node.js框架由于是采用JavaScript语法进行调用的&#xff0c;因此Node.js环境除了用来编写调试Node.js代码&#…

mybatis基础操作(三)

动态sql 通过动态sql实现多条件查询&#xff0c;这里以查询为例&#xff0c;实现动态sql的书写。 创建members表 创建表并插入数据&#xff1a; create table members (member_id int (11),member_nick varchar (60),member_gender char (15),member_age int (11),member_c…
最新文章