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

ACM金牌带你零基础直达C语言精通-课程资料

 本笔记属于船说系列课程之一,课程链接:ACM金牌带你零基础直达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的。

  • 16
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

初猿°

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值