week 01 C语言基础

Week01

一.语言基础认知

1.1 C语言是什么?

通过一系列的语法和语义规则来描述计算机程序的行为和逻辑,可以将程序转化为二进制指令,并由CPU执行。

语言=语法+逻辑

1.2 C语言的特点

  • 简洁

    • C语言的语法简单,简单明了,使得程序易于阅读和理解。
  • 高效

    • C语言的执行效率高,可以用于开发需要高性能的应用程序。
  • 可移植

    • C语言可以在不同的硬件平台和操作系统上运行,具有较高的可移植性。
  • 模块化

    • C语言支持函数和结构体等模块化编程方法,使得程序的复杂性得到有效控制。
  • 标准化

    • C语言的语法和标准库已经被ISO和ANSI标准化,具有广泛的应用和兼容性。

1.3 C语言的应用领域

  • 系统软件
  • 嵌入式软件
  • 网络设备
  • 游戏开发

二.C语言的基础语法

2.1 第一个C语言程序

// 单行注释 快捷键 ctrl+k,ctrl+c
// 取消注释 快捷键 ctrl+k,ctrl+u
/*
ctrl+shift+/ 切换注释块

*/
#include <stdio.h>  //头文件 对库函数进行声明 比如 printf
//main 函数是主函数,一个工程有且只有一个主函数 ,也是程序的入口函数
// main 左边的int是函数的返回值 右边的()里是函数的形参 {}是函数体,代码块
int main(int num)
{
    printf("Hello,World!\n");
    return 0 ;
}

int main()
{
    printf("Hello,World!\n");
    return 0 ;
}

C程序代码规范:

1.一个说明或者一个语句独占一行,比如:包含头文件,一个可执行语句都要执行。

2.函数体内要有明显缩进,按一个tap键为一个缩进

3.括号要成对写,如果要删除,也要成对删除

4.一句可执行语句的末尾一定要加分号

2.2语言语法规范

C语言规定,标识符可以是字母(A~Z,a~z)、数字(0~9)、下划线_组成的字符串,并且第一个字符必须是字母或下划线。

#include<stdio.h>  

   extern int kk;//在外部声明了一个变量 ,不是定义   kk可以在别的文件中定义
  extern int kk1;
  extern void fn();
int main(int num) {
    //变量  可以变化的量 
    int a;//定义变量
    a = 90;//赋值
    int b = 90;//定义的的同时赋值
    int m, n;//同时定义多个变量多个变量
    m = 1;
    n = 2;

    printf("打印输出m的值:%d\n",m);  // \n转义字符  表示换行 
    printf("hhhhhhhhhhhhhhhhhhhh");
    fn();
    return 0;

}
int kk1=200;
int kk=100;
extern int a;
void fn(){
    printf("%d",a);
}

2.3变量的声明和定义

变量的声明与定义的区别:

1、定义变量是创建了变量并为其分配内存,声明没有分配内存

2、一个变量在一定的区域内只能被定义一次,声明可以有很多次

变量声明的本质:声明就是告诉编译器,这个变量已经在别的地方定义过了,这个只做基本的声明,

并没有为其分配内存。

2.4标识符的命名规范:

1.只能由数字,字母,下划线组成

2.不能以数字开头

3.不能使用c语音的关键字和保留字

4.见名之意

5.尽量使用大驼峰和小驼峰的方式命名,比如:

(1)大驼峰命名法 每个单词首字母大写 例如:MyFirstName

​ (2) 小驼峰命名法 从第二个单词开始,首字母大写 例如:myFirstName

​ (3)下划线命名法 每个单词之间用_连接 例如:my_first_name

2.5语言的关键字

数据类型关键字 (12个)
char(字符型) ,  short(短整型) ,int(整型)  ,long(长整型)   ,  float(浮点型),   double(浮点型,变量精度更高),   
unsigned(无符号数),  signed(有符号数),   struct(结构体),   union(联合体又叫共用体),   enmu(枚举),   
 void(空类型)--特殊不能定义变量,修饰函数的参数或返回值,表示没有
控制语句关键字 (12个)
if  , else  , switch  ,  case ,  default
for  ,do,  while   ,break,   continue,   goto,    return
存储类关键字(5个)
auto(以后一般不用) ,  extern(外部的),   register(寄存器),   static,    const
  • register是寄存器的意思,用register修饰的变量是寄存器的变量

三.C语音的数据类型

C语言中,数据类型分为四类:

  • 基本数据类型

  • 构造数据类型

  • 指针类型

  • 空类型

3.1 字符型 char

char 表示为字符类型,用于存储单个字符,每个字符变量都是由8个bit位构成,在内存中就是一个字节

相关特性:

  • 给字符型变量赋值时,需要用一对英文半角格式的单引号('')把字符括起来。
  • 字符变量在内存单元存储时,是将与该字符对应的ASII码放在变量的存储单元中。
  • char的本质就是一个1个字节大小的模型


1.字符串 只占一个字节 '' 多个字节 会有截断报告

2.字符 输出 %c %d 对应的字符及ASCII码

3.'\0','0'的区别

4.大小写转换
//1.char字符串,用char定义的变量是字符型变量,占1个字节
char ch='a';
char ch1='1';
char ch2='1234';// 错误的,因为必须是一个字节
//printf("%d,%c", ch1, ch1);//52  4   数据显法不正常   有截断

#include<stdio.h>
int main() {
    //char  字符类型   单引号括住  只能作用于一个字符 转义字符除外
    //单引号的作用:1、定义字符  2、取字符的Ascll值
    //注意:printf %c输出的是字符   %d输出的是ASCII值
    char ch = 'a';
    printf("%c\n", ch);
    printf("%d\n", ch);

    char ch2 = '0';
    printf("%d\n", ch2);//48 是字符'0'的ASCLL值
    printf("%c\n", ch2);//'0'
    char ch3 = '\0';
    printf("%d\n", ch3);//'\0' 计算机存的是 0

    int a = 65;
    printf("%c\n", a);
    printf("%d\n", a);

    //注意:'0'和'\0'的区别
    //字符0存的是 48   '\0'存的是0

    //字符的大小写转换
    //'a' 97 'b' 98 'c' 99 ...... 'z' 122
    // 'A' 65 'B' 66 'c' 67 ...... 'z' 90

    char ch4 = 'a';
    ch4 = ch4 - ('a' - 'A');//小写转大写
    printf("%c\n", ch4);
    char ch5 = 'A';
    ch5 = ch5 + ('a' - 'A');
    printf("%c\n", ch5);//大写转小写
    return 0;
}

3.2 布尔类型

布尔类型是一种处理逻辑的类型,其有两个值,分别是真(true)或假(false),它在内存中的长度一般只占用1个字节。

  • 早期C语言没有布尔类型数据,以0代表逻辑假,1代表逻辑真;
  • C99标准定义了新的关键字bool,提供了布尔类型,或者也可以使用stdbool.h中的bool;
布尔类型是一种处理逻辑的类型,其有两个值,分别是真(true)或假(false),它在内存中的长度一般只占用1个字节。
- 早期C语言没有布尔类型数据,以0代表逻辑假,1代表逻辑真;
- C99标准定义了新的关键字bool,提供了布尔类型,或者也可以使用stdbool.h中的bool

3.3 数据类型的长度

存储单位说明

术语 含义
bit(比特) 一个二进制代表一位,一个位只能表示0或1两种状态。数据传输是习惯以“位”(bit)为单位。
Byte(字节) 一个字节为8个二进制,称为8位,计算机中存储的最小单位是字节。数据存储是习惯以“字节”(Byte)为单位。
1b 1bit
1B 1Byte = 8bit
1KB 1KB = 1024B
1MB 1MB = 1024KB
1GB 1GB = 1024MB
1TB 1TB = 1024GB
1PB 1PB = 1024TB
...... ......

基本数据类型的长度

数据类型的长度会受操作系统平台的影响,所以在不同平台下基本数据类型的长度是不一样的。

#include<stdio.h>  
#include<stdbool.h>
int main(int num) {
 //sizeof()作用:返回对象在计算机内存中所占的字节数,返回64位(8bytes)无符号整型
 //所以占位符使用%lld 代开long long int (8bytes)       %zu  打印无符号整型 size_t
    printf("%zu", sizeof(size_t));//8   size_t 类型本身的大小
    //--------上面的了解
    printf("int 型的字节长度%lld\n", sizeof(int));//4
    printf("short int 型的字节长度%lld\n", sizeof(short int));//2
    printf("long int 型的字节长度%lld\n", sizeof(long int));//4
    printf("long long int型的字节长度%lld\n ", sizeof(long long int));// 8
    printf("char 型的字节长度%lld\n", sizeof(char));//1
    printf(" float 型的字节长度%lld\n", sizeof(float));//4
    printf(" double 型的字节长度%lld\n", sizeof(double));//8
    printf("long double 型的字节长度%lld\n", sizeof(long double));//8
    printf("bool 型的字节长度%lld", sizeof(bool));//1
    //ps:int在不同的编译环境下。字节有所不同,在TC(Turbo C)下2字节  在VC(Visual C++)下是4个字节
    //    在单片机开发中,int在8位的单片机中占2个字节  在32位单片机 中长度为4个字节 

    return 0;
}

**在单片机开发中,int在8位的单片机中占2个字节 在32位单片机 中长度为4个字节 **

//2.short短整型,使用short定义的变量是短整型变量,占2个字节
short int a=11;   // -32768~~~32767

 //3.int 整型,用int定义的变量是整型变量,在
 
 int a1=44; // -20亿~~~~20亿
 //4.long长整型,用long定义的变量是长整型的,在32位系统下占4个字节
 long int a2=66;
 
printf("sizeof(a)=%d\n" ,sizeof(a));//2
printf("sizeof(a1)=%d\n", sizeof(a1));//4
printf("sizeof(a2)=%d\n", sizeof(a2));//4

//5.float单浮点型(实数),用float定义的变量是单浮点型的实数,占4个字节
float c=3.8f;
//6.double双浮点型(实数),用double定义的变量是双浮点型的实数,占8个字节
double b=3.8;
//7.struct这个关键字是与结构体类型相关的关键字,可以用它来定义结构体类型,以后讲结构体的时候再讲
//8.union 这个关键字是与共用体(联合体)相关的关键字,以后再讲
//9.enum与枚举类型相关的关键字 以后再讲
//10.signed有符号(正负)的意思
 在定义char、 整型(short  int long)数据的时候用signed修饰,
 代表咱们定义的数据是有符号的,可以保存正数,也可以保存负数
 如: signed int a=10;
     signed int b=-6;
     注意:默认情况下signed可以省略
 //11. unsigned无符号的意思
 在定义char 、整型(short int long)数据的时候用unsigned修饰,代表咱们定义的数据是无符号类型的数据
 只能保存 正数 和0
 unsigned int a=101;
 unsigned int a=-101;//错误
 unsigned char myChar=255;
 printf("%u\n",myChar);
 //12. void空类型的关键字
 charintfloat 都可以定义变量
 ----
 void不能定义变量,没有void类型的变量
 void是用来修饰函数的参数或者返回值,代表函数没有参数或没有返回值
 void fun(void){
      
 }
 代表fun函数没有返回值,fun函数没有参数

3.4 可移植类型

最开始我们介绍C语言是一门跨平台的编程语言,使用C语言编写的程序可以在不同的系统平台下运行,这里有一些前提,为了更好的兼容不同平台,我们在使用基本上数据类型的时候会采用可移植的类型,这些类型可以确保在不同的平台下稳定的运行

3.5 stdint.h提供了标准的整数类型,

这些类型在不同的系统和编译器之间是可移植的。这个头文件定义了以下几种类型的整数:

  • int8_t,uint8_t: 8位有符号和无符号整数
  • int16_t,uint16_t:16位有符号和无符号整数
  • int32_t,uint32_t:32位有符号和无符号整数
  • int64_t,uint64_t:64位有符号和无符号整数

此外,stdint.h还定义了一些与这些类型相关的宏,例如in,INT16_MIN等,这些宏表示对应类型的最大值 、最小值。

3.6 inttypes.h提供了更多的整数类型和函数。

这个头文件定义了以下几种类型的整数:

  • intmax_t:最大的整数类型
  • uintmax_t:最大的无符号整数类型
  • intptr_t:可以转换为指针的整数类型
  • uintptr_t:可以转换为无符号整数的指针类型

此外,inttypes.h还定义了一些与这些类型相关的宏,例如UINTMAX_MAX,INTMAX_MAX等,这些宏表示对应类型的最大值。


#include<stdio.h>  
// #include<stdbool.h>  提供了bool数据类型
#include<inttypes.h>   //提供了精确宽度整数类型  ===可移植类型
int main(int num) {
//可移植类型有什么作用?
 // c语言有跨平台特点,可在不同系统下运行,为了兼容各种操作系统,inttypes.h头文件里规定了精确宽度整数类型
//8位整型
    int8_t a = 17;
    printf("%lld\n", sizeof(a));
    //16位整型
    int16_t b = 9;
    printf("%lld\n", sizeof(b));
    //无符号的8位整型
    uint8_t c = 90;
    printf("%lld\n",sizeof(c));
    --------------------------
    intmax_t my_intmax = INTMAX_MAX; // 假设我们想输出 intmax_t 类型的最大值  
      printf("\n%lld" , my_intmax);
    return 0;
}
#include<stdio.h>
//stdint.h 提供了一些可移植性的整型
#include<stdint.h>
#include<inttypes.h>
void main() {
    //int num = 0;
    int8_t num = 90;//8位有符号整型  
    int16_t age = 18;//16为有符号整型   相当于short
    int32_t nu=900; //32位有符号整型  相当于int
    printf("%lld\n", sizeof(num));
    printf("%lld\n", sizeof(age));
    printf("%lld\n", sizeof(nu));
    printf("hello world\n");
    //stdint.h行定义了一些宏常量
    printf("%d\n", INT8_MIN);//8位有符号整型最小值
    printf("%d\n", INT8_MAX);//8位有符号整型最大值
    printf("%d\n", UINT8_MAX);//8为无符号整型的最大值
}

3.7 常量

在程序执行过程中,值不发生改变的量称为常量。

C语言的常量可以分为直接常量、自定义常量和系统定义常量3类

1、直接常量也称为字面量,可以直接拿来使用,无需说明,例如:

整型常量 100,200,-100,0
实型常量 3.14 , 0.125,-3.123f
字符型常量 'a', 'b', '1'
字符串常量 "a", "ab","12356"

注意:

1、不以f结尾的实型常量为double类型

2、以f结尾的实型常量为float类型

2、自定义常量有两种方式

  • #define定义的预处理常量,一般出现在函数体的外部
  • const声明的常量 一般出现在函数体的内部

3、系统定义的常量

C语言提供了一些常量库,比如有:float.h、limits.h等,这些常量同样受操作系统平台的影响会在不同的平台下不一样。

float.h

#include<stdio.h>
#define  PP  3.14 //define定义的预处理常量
#include<float.h>
#include<limits.h>  //float.h  limits.h是c语言的常量库,提供了一些系统定义的常量
int main() {
    //1、常量:直接常量  自定义常量   系统定义常量
    printf("直接常量  整型:%d\n", 100);
    printf("直接常量  浮点型 %f\n", 3.15);
    printf("直接常量  字符型 %c\n", 'a');

    //2、自定义常量有两种定义方式:
    //1)、#define来定义    又叫预处理常量 这种方式一般出现在函数体的外部
    //2)、const定义常量   这种方式一般出现在函数体的内部
    const double pi = 3.14;//常量
    //pi = 2.18;//报错  常量不允许修改
    printf("define定义的预处理常量:%f\n",PP);
    printf("const定义的常量:%lf\n", pi);


    //3、系统定义的常量
    // 注意:这些常量同样受操作系统的影响会在不同的平台下不一样
    //float类型能够表示的最大最小值
    printf("float类型的最大值:%lf\n",FLT_MIN);
    printf("float类型的最小值:%lf\n", FLT_MAX);
     printf("%lf     %E\n", FLT_MAX, FLT_MAX);   // 3.402823E+38
    //char类型位数以及能够表示的最大最小值
    printf("char类型的最小值:%d\n", CHAR_BIT);//8
    printf("char类型的最小值:%d\n", CHAR_MIN);
    printf("char类型的最大值:%d\n", CHAR_MAX);
    //short类型的最大、最小值
    printf("short类型的最大值:%d\n", SHRT_MAX);
    printf("short类型的最小值:%d\n", SHRT_MIN);
    //int类型的最大值  最小值
    printf("int类型的最大值:%d\n", INT_MAX);
    printf("int类型的最小值:%d\n", INT_MIN);
    //long int类型的最大、最小值
    printf("long类型的最大值:%ld\n", LONG_MAX);
    printf("long类型的最小值:%ld\n", LONG_MIN);
    return 0;

}

四.数值表示

数据在计算机中是以二进制形式存储的

1、负数在计算机中以补码的方式存储

2、非负数在计算机中以原码的方式存储 (原 反 补 三码合一)

3、八进制以原码存储

4、十六进制以原码存储

计算机数据的存储使用二进制补码形式存储 ,并且最高位是符号位。

​ 正数:最高位是0

​ 负数:最高位是1

规定1:正数的补码与反码、原码一样,称为三码合一

规则2:负数的补码与反码、原码不一样

​ 负数的原码:把十进制转为二进制,然后最高位设1

负数的反码:在原码的基础上,最高位不变,其余位取反(0变1,1变0)

负数的补码:反码+1

4.1进制

  • 进制也就是进位制,是人们规定的一种进位方法

  • 对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位

  • 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位

十进制 二进制 八进制 十六进制
0 0 0 0
1 1 1 1
2 10 2 2
3 11 3 3
4 100 4 4
5 101 5 5
6 110 6 6
7 111 7 7
8 1000 10 8
9 1001 11 9
10 1010 12 A
11 1011 13 B
12 1100 14 C
13 1101 15 D
14 1110 16 E
15 1111 17 F
16 10000 20 10

4.2 二进制

十进制转进制 除n,倒序

1001 1001 ----八进制 (每三位一组) 0 231 ---十六进制 (每四位一组)0x99

  • 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数

  • 它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”

  • 当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的

  • 十进制转化二进制的方法:

  • 用十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果

4.3 八进制

  • 八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1

  • 一些编程语言中常常以数字0开始表明该数字是八进制

  • 八进制的数和二进制数可以按位对应(八进制一位对应二进制三位),因此常应用在计算机语言中

  • 八进制和二进制互转:

  • 十进制转化八进制的方法:

  • 用十进制数除以8,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果

4.4 十六进制

  • 十六进制(英文名称:Hexadecimal),同我们日常生活中的表示法不一样,它由0-9,A-F组成,字母不区分大小写

  • 与10进制的对应关系是:0-9对应0-9,A-F(或a-f)对应10-15

  • 十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位),因此常应用在计算机语言中

  • 十六进制和二进制互转:

4.5、c语言如何表示进制数

十进制 以正常数字1-9开头,如15
八进制 以数字0开头,如017
十六进制 以0x或0X开头,如0xf
二进制 以0b或0B开头,如0b1111
#include<stdio.h>
int main() {

    //进制
    //十进制赋值
    int a = 17;
    //八进制赋值
    int b = 017;
    //十六进制赋值
    int c = 0xf;
    //二进制赋值
    int d = 0b111;
    printf("a,b,c,d分别是:%d,%d,%d,%d", a, b, c, d);
         printf("a,b,c,d分别是:%d,%#o,%#x,%d", a, b, c, d);
    return 0;
}

4.6、数值的存储方式

计算机底层都是存储数据都是采用二进制,但二进制也有几种,比如:原码、反码、补码。接下来我们来看看他们之间的关系的意义作用.

原码十进制数按照:除二取余、倒序排列,得到的就是原码。

  • 10 -> 0000 1010
  • -10 -> 1000 1010
  • -1 -> 1000 0001
  • 1 -> 0000 0001

问题:原码在做计算的时候会出现一些问题,比如正负数的加法运算,以及零的问题。

●正负数加法 -1 + 1 = 0

1000 0001 + 0000 0001 ---------------- 1000 0010 -> -2 ?

●正负零 +0 和 -0 十进制数字0,占了两个二进制;

0000 0000 1000 0000

反码为了解决上面的问题,出现了反码,反码的计算规则如下:

  • 正数的反码就是原码本身;
  • 负数的反码是按位取反(但符号位不变);

示例●1 -> 0000 0001 -> 0000 0001 ●-1 -> 1000 0001 -> 1111 1110

0000 0001 + 1111 1110 ----------------- 1111 1111

1111 1111 是运算完之后的结果,但要注意,这时还是反码,需要重新返回来:1000 0000 。反码解决了正负数加法问题,但正负零的问题还是存在。

补码正数的补码就是原码本身;负数的补码就是在反码的基础上+1;

● 1 -> 0000 0001 -> 0000 0001 -> 0000 0001 三码合一

●-1 -> 1000 0001 -> 1111 1110 -> 1111 1111

0000 0001 + 1111 1111 ---------------- 0000 0000 正负0: 0000 0000 1000 0000 ->1111 1111->0000 0000

补码在正负数加减法运算时没问题,也不会出现正负零占两个二进制。

但 1000 0000 不表示为负零,用来表示什么呢?计算机其实默认把8位有符号二进制 1000 0000 表示为 -128 。*****

#include<stdio.h>
int main() {

    char c = 'A';//字符型   1个字节
    short s = 100;//短整型  2个字节
    long l = 12;//长整型    4个字节
    int m = 9;//整型     2/4字节  VC下就是4个字节
    float p = 3.1415926;//单浮点  4个字节
    double d = 2.19;//双浮点   8个字节
    char* name = "murphy";//字符串类型   8个字节
    unsigned int ui = 90;//无符号整型   2/4个字节
    printf("%lld\n", sizeof(char*));//8    ****


    //整型输出
    printf("c=%d\n", c);//整型int  %d
    printf("s=%hd\n", s);//短整型short    %hd
    printf("l=%ld\n", l);//长整型long   %ld
    printf("m=%d\n", m);

    //实型输出
    printf("p=%f\n", p);//单精浮点数float   %f  
    printf("p=%.5f\n", p);//.5表示保留5位小数
    printf("d=%.2lf\n", d);//  双精度浮点数   %lf   .2表示保留2位小数

    //字符型输出
    printf("c=%c\n", c);//字符型  %c
    //字符串类型
    printf("name=%s\n", name);//字符串类型char*   %s
    //无符号整型
    printf("ui=%u\n", ui);//无符号整型  unsigned int   %u
    //八进制和十六进制  可以加上前缀#  自动输出八进制和十六进制数据
    printf("bbb=%#o\n", 120);  //输出八进制 %#o
    printf("ccc=%#x\n", 120);  //输出十六进制  %#x
    //内存地址
    printf("ps=%p\n", &c);//输出变量的内存地址
    printf("ps3=%p", &ui);
    return 0;
}

移码●补码符号位取反就是移码,一般用来计算浮点数作为阶码和比较数的大小使用。 (了解一下概念即可)

十进制数 补码 移码
+15 0000 1111 1000 1111
-15 1111 0001 0111 0001
+0 0000 0000 1000 0000

五.输入输出

5.1 输出语句

  • 输出:将程序的运行结果输出到控制台或终端窗口中
  • printf语法格式:
  • printf("输出格式符",输出项)

printf("我今年%d岁了\n",age) //%d表示整型占位符

格式化占位符

打印格式 对应数据类型 含义
%c char 字符型,输入的数字按照ASCII码相应转换为对应的字符
%hd short int 短整数
%hu unsigned short 无符号短整数
%d int 接受整数值并将它表示为有符号的十进制整数
%u unsigned int 无符号10进制整数
%ld long 接受长整数值并将它表示为有符号的十进制整数
%f float 单精度浮点数
%lf double 双精度浮点数
%e,%E double 科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写
%s char * 字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符)
%p void * 以16进制形式输出指针
%o unsigned int 无符号8进制整数
%x,%X unsigned int 无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF
#include<stdio.h>
int main() {

    char c = 'A';//字符型   1个字节
    short s = 100;//短整型  2个字节
    long l = 12;//长整型    4个字节
    int m = 9;//整型     2/4字节  VC下就是4个字节
    float p = 3.1415926;//单浮点  4个字节
    double d = 2.19;//双浮点   8个字节
    char* name = "murphy";//字符串类型   8个字节
    unsigned int ui = 90;//无符号整型   2/4个字节
    printf("%lld\n", sizeof(char*));//8    ****


    //整型输出
    printf("c=%d\n", c);//整型int  %d
    printf("s=%hd\n", s);//短整型short    %hd
    printf("l=%ld\n", l);//长整型long   %ld
    printf("m=%d\n", m);

    //实型输出
    printf("p=%f\n", p);//单精浮点数float   %f  
    printf("p=%.5f\n", p);//.5表示保留5位小数
    printf("d=%.2lf\n", d);//  双精度浮点数   %lf   .2表示保留2位小数

    //字符型输出
    printf("c=%c\n", c);//字符型  %c
    //字符串类型
    printf("name=%s\n", name);//字符串类型char*   %s
    //无符号整型
    printf("ui=%u\n", ui);//无符号整型  unsigned int   %u
    //八进制和十六进制  可以加上前缀#  自动输出八进制和十六进制数据
    printf("bbb=%#o\n", 120);  //输出八进制 %#o
    printf("ccc=%#x\n", 120);  //输出十六进制  %#x
    //内存地址
    printf("ps=%p\n", &c);//输出变量的内存地址
    printf("ps3=%p", &ui);
    return 0;
}

补充:

%zu****:用于输出 sizeof() 返回值是 size_t****类型

size_t类型的无符号整数。

size_t是一个无符号长长整数类型

5.2 输入语句

  • 输入:接收用户****输入的数据的过程

  • scanf语法格式:

  • ​ scanf("格式化字符串",&变量1,&变量2,......);

  • 格式化字符串用于指定输入的数据类型及其格式

  • 变量1、变量2等是要读入的变量的地址

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
    int a;
    printf("请输入年龄:");
    //scanf_s("%d", &a); 
    scanf("%d", &a);  //&a代表变量a的内存地址
    printf("5年后您的年龄是:%d", a + 5);
    return 0;
}

这个错误信息提示你的代码中使用了 scanf 函数,这个函数可能存在安全问题,你可以考虑使用 scanf_s 函数来代替,以确保代码的安全性。

解决方法有两种:

1、将scanf改为scanf_s即可

2、在代码的最上行加入:#define _CRT_SECURE_NO_WARNINGS

六.运算符

6.1 算数运算符

运算符 术语 示例 结果
+ 10 + 5 15
- 10 - 5 5
* 10 * 5 50
/ 10 / 5 2
% 取模(取余) 10 % 3 1
++a 前自增 a=2; b=++a; a=3; b=3;
a++ 后自增 a=2; b=a++; a=3; b=2;
--a 前自减 a=2; b=--a; a=1; b=1;
a-- 后自减 a=2; b=a--; a=1; b=2;
#include<stdio.h>
int main() {

    //算术运算符
    int a = 12;
    float b = 3.14;
    printf("a+b=%f\n", a + b);   //+
    printf("a-b=%f\n", a - b);  //-
    printf("a*b=%f\n", a * b);//*
    printf("2/b=%f\n", a / b);// 除/ 
    //两数相除,如果想得到小数的结果,分子分母必须有一个为小数,否则结果只能是整数
    printf("12/3=%f\n", 12/3.0);  
    printf("12对5取余:%d\n", 12 % 5);//%  取余

    //前置++   先加后用
    int m = 9;
    int n = ++m;
    printf("前置++:%d\n", n);  //10
    printf("m的值为:%d\n", m);//10
    //后置++  先用后加
    int p = 9;
    int q = p++;
    printf("后置加加:%d\n", q);//9
    printf("p的值为:%d\n", p);//10

    //同理,前置--  先减后用    后置--先用后减
    int j = 5;
    int k = --j;
    printf("前置--:%d\n", k);//4
    printf("%d\n", j);//4
    int count = 5;
    int cc = count--;
    printf("后置--:%d\n", cc);//5
    printf("%d\n", count);//4
    return 0;
}

6.2 赋值运算符

运算符 术语 示例 结果
= 赋值 a=2; b=3; a=2; b=3;
+= 加等于 a=0; a+=2;等同于 a = a + 2; a=2;
-= 减等于 a=5; a-=3;等同于 a = a - 3; a=2;
*= 乘等于 a=2; a*=2;等同于 a = a * 2; a=4;
/= 除等于 a=4; a/=2;等同于 a = a / 2; a=2;
%= 模等于 a=3; a%=2;等同于 a = a % 2; a=1;

6.3 比较运算符

C 语言的比较运算中, “真”用数字“1”来表示, “假”用数字“0”来表示。

运算符 术语 示例 结果
== 相等于 4 == 3 0
!= 不等于 4 != 3 1
< 小于 4 < 3 0
> 大于 4 > 3 1
<= 小于等于 4 <= 3 0
>= 大于等于 4 >= 1 1

6.4 逻辑运算符

运算符 术语 示例 结果
! !a 如果a为假,则!a为真;如果a为真,则!a为假。
&& a && b 如果a和b都为真,则结果为真,否则为假。
|| a || b 如果a和b有一个为真,则结果为真,二者都为假时,结果为假。

6.5 位运算符

常见的位运算符号有&、|、^、~、>>、<<,分别代表着如下含义:

运算符 术语 示例 结果
& 按位与运算 011 & 101 2个都为1才为1,结果为001
| 按位或运算 011 | 101 有1个为1就为1,结果为111
^ 按位异或运算 011 ^ 101 不同的为1,结果为110
~ 取反运算 ~011 100
<< 左移运算 1010 << 1 10100
>> 右移运算 1010 >> 1 0101

6.5.1 按位与(&)运算:位与位进行比较,如果都为1,则为1,否则为0;

/按位运算符:针
/*1、按位 与运算   &  位与位进行比较 如果都为1,则为1,否则为0
* 例如:40 & 15 = 
* 40转成二进制: 0010 1000
* 15转成二进制: 0000 1111
* 
* 0010 1000
* 0000 1111
* ------------
* 0000 1000======>8     
*/
printf("%d\n", 40 & 15);//8

6.5.2 按位或(|)运算:位与位进行比较,如果都为0,则为0,否则为1;

/*
2、按位或|:  位与位进行比较  如果都为0则为0,否则为1
例如:40  | 15
    0010 1000
    0000 1111
    -----------
    0010 1111======>47
*/
printf("%d\n", 40 | 15);//47

6.5.3 按位异或运算:位与位进行比较,相同为0,不同为1;

/*3、异或运算^:位与位进行比较 相同为0 不同为1
* 例如:40 ^15
*    0010 1000
*    0000 1111
* --------------
*    0010 0111====>39
*/
printf("%d\n", 40 ^ 15);//39

6.5.4 按位取反运算:补码取反,再将取反后的补码转为原码;

/**
 * 按位取反运算:补码取反,再将取反后的补码转为原码。
 *      1、正数取反:由于正数的原码和补码是相同的,取反的方式简便了些。
 *              补码(原码) -> 取反 -> 补码逆运算 -> 反码逆运算(符号位不变) -> 取反后的原码
 *      2、负数取反:
 *              原码 -> 反码 -> 补码 -> 取反 -> 取反后的补码即原码
 * 示例:
 *            原码(补码)  取反的补码   补码逆运算-1  反码逆运算
 *      ~40 = 0010 1000 -> 1101 0111 -> 1101 0110 -> 1010 1001 = -41
 *
 *            原码(补码)  取反的补码   补码逆运算-1  反码逆运算
 *      ~15 = 0000 1111 -> 1111 0000 -> 1110 1111 -> 1001 0000 = -16
 *
 *                原码         反码          补码          取反
 *      ~-15 = 1000 1111 -> 1111 0000 -> 1111 0001 -> 0000 1110 = 14
 */
printf("~40 = %d\n", ~40);
printf("~15 = %d\n", ~15);
printf("~-15 = %d\n", ~(-15));

6.5.5 左移运算符

将数字的二进制补码全部向左移动,空出来的位置补0,超出范围的二进制数丢弃

有符号的数据左移后最高位如果为1,则需要进行逆运算;

6.5.6右移运算符 >>

逻辑移位****:将数字的二进制补码全部向右移动,空出来的位置补0,超出范围的二进制数丢弃

算术移位:左边移入的位由原先该值的符号位决定,符号位为1,则移入的位均为1,符号位为0,则移入的位均为0,这样能保证原数的正负形式不变

标准规定,无符号值执行的所有位移操作都是逻辑移位,对于有符号值,到底采用逻辑移位还是算术移位取决于编译器。

6.5.7 运算符的优先级

优先级 运算符 名称或含义 使用形式 结合方向 说明
1 [] 数组下标 数组名[常量表达式] 左到右 --
() 圆括号 (表达式)/函数名(形参表) --
. 成员选择(对象) 对象.成员名 --
-> 成员选择(指针) 对象指针->成员名 --
2 - 负号运算符 -表达式 右到左 单目运算符
~ 按位取反运算符 ~表达式
++ 自增运算符 ++变量名/变量名++
-- 自减运算符 --变量名/变量名--
***** 取值运算符 *指针变量
& 取地址运算符 &变量名
! 逻辑非运算符 !表达式
(类型) 强制类型转换 (数据类型)表达式 --
sizeof 长度运算符 sizeof(表达式) --
3 / 表达式/表达式 左到右 双目运算符
***** 表达式*表达式
% 余数(取模) 整型表达式%整型表达式
4 + 表达式+表达式 左到右 双目运算符
- 表达式-表达式
5 << 左移 变量<<表达式 左到右 双目运算符
>> 右移 变量>>表达式
6 > 大于 表达式>表达式 左到右 双目运算符
>= 大于等于 表达式>=表达式
< 小于 表达式<表达式
<= 小于等于 表达式<=表达式
7 == 等于 表达式==表达式 左到右 双目运算符
!= 不等于 表达式!= 表达式
8 & 按位与 表达式&表达式 左到右 双目运算符
9 ^ 按位异或 表达式^表达式 左到右 双目运算符
10 | 按位或 表达式|表达式 左到右 双目运算符
11 && 逻辑与 表达式&&表达式 左到右 双目运算符
12 || 逻辑或 表达式||表达式 左到右 双目运算符
13 ?: 条件运算符 表达式1?表达式2: 表达式3 右到左 三目运算符
14 = 赋值运算符 变量=表达式 右到左 --
/= 除后赋值 变量/=表达式 --
*= 乘后赋值 变量*=表达式 --
%= 取模后赋值 变量%=表达式 --
+= 加后赋值 变量+=表达式 --
-= 减后赋值 变量-=表达式 --
<<= 左移后赋值 变量<<=表达式 --
>>= 右移后赋值 变量>>=表达式 --
&= 按位与后赋值 变量&=表达式 --
^= 按位异或后赋值 变量^=表达式 --
|= 按位或后赋值 变量|=表达式 --
15 逗号运算符 表达式,表达式,… 左到右 --
posted @   DOOM12138  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示