week 01 C语言基础

news/2025/2/22 10:59:02/文章来源:https://www.cnblogs.com/doom12138/p/18730674

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' 计算机存的是 0int 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' 90char 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_tprintf("%zu", sizeof(size_t));//8   size_t 类型本身的大小//--------上面的了解printf("int 型的字节长度%lld\n", sizeof(int));//4printf("short int 型的字节长度%lld\n", sizeof(short int));//2printf("long int 型的字节长度%lld\n", sizeof(long int));//4printf("long long int型的字节长度%lld\n ", sizeof(long long int));// 8printf("char 型的字节长度%lld\n", sizeof(char));//1printf(" float 型的字节长度%lld\n", sizeof(float));//4printf(" double 型的字节长度%lld\n", sizeof(double));//8printf("long double 型的字节长度%lld\n", sizeof(long double));//8printf("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修饰,代表咱们定义的数据是无符号类型的数据只能保存 正数 和0unsigned int a=101;unsigned int a=-101;//错误unsigned char myChar=255;printf("%u\n",myChar);//12. void空类型的关键字char  、int 、 float 都可以定义变量----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为有符号整型   相当于shortint32_t nu=900; //32位有符号整型  相当于intprintf("%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);//8printf("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  %dprintf("s=%hd\n", s);//短整型short    %hdprintf("l=%ld\n", l);//长整型long   %ldprintf("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);  //输出八进制 %#oprintf("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  %dprintf("s=%hd\n", s);//短整型short    %hdprintf("l=%ld\n", l);//长整型long   %ldprintf("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);  //输出八进制 %#oprintf("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);  //10printf("m的值为:%d\n", m);//10//后置++  先用后加int p = 9;int q = p++;printf("后置加加:%d\n", q);//9printf("p的值为:%d\n", p);//10//同理,前置--  先减后用    后置--先用后减int j = 5;int k = --j;printf("前置--:%d\n", k);//4printf("%d\n", j);//4int count = 5;int cc = count--;printf("后置--:%d\n", cc);//5printf("%d\n", count);//4return 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  | 150010 10000000 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 逗号运算符 表达式,表达式,… 左到右 --

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Qt布局之QSplitter

简述 QSplitter拆分器是一个布局控件。用户通过拖动它们之间的边界来控制子部件的大小。 在不确定子部件UI大小时,可以用此控件布局,让用户自行调整控件尺寸。 属性名称 类型 描述childrenCollapsible bool 用户是否可以将子部件的大小调整为0。默认情况下,子控件是可…

学习理论:预测器-拒绝器多分类弃权学习

弃权学习(learning with abstention)主要是为了使分类器在学习过程中可能出现的误导性或者不正确的信息时(这常被称为“幻觉”),能够对做出预测进行弃权。目前,弃权学习的方法主要可以分为以下几种:基于置信度的方法(confidence-based methods)。这种方法在预训练模型…

Cypher Chapter 6:DIGITAL CRYPTOGRAPHY

PUZZLE1 0110 0100 0110 0001 0111 0100 0110 0001SOLVE1 通过 ASCII 码表可知,明文为 data。 PUZZLE2 HELLO 0011 1111 0010 1010 0011 1110 0010 0000 0010 1011SOLVE2 容易猜出答案是 world,不过如何得到的呢? 考虑将 HELLO 换为 ASCII 码形式,即 0100 1000 0100 0101 0…

2246. 相邻字符不同的最长路径(难)

目录题目题解:dfs 题目给你一棵 树(即一个连通、无向、无环图),根节点是节点 0 ,这棵树由编号从 0 到 n - 1 的 n 个节点组成。用下标从 0 开始、长度为 n 的数组 parent 来表示这棵树,其中 parent[i] 是节点 i 的父 节点,由于节点 0 是根节点,所以 parent[0] == -1 。…

普通人如何靠 AI 副业,1 个月实现月薪 3 万 +

在物价飞涨、经济低迷的今天,仅靠死工资,却有着不固定的开销?房贷、车贷、孩子的教育费用…… 望着日益增长的开销,你是否也在夜深人静时,为钱包的羞涩而发愁?无数次幻想过拥有一份高收入的副业,却始终在迷茫中徘徊,不知从何下手。 如今,AI 时代的浪潮汹涌而来,为我们…

C内存模型

分区 在C语言中,内存被分为以下几个部分 .text 代码段,存放程序的可执行代码,不可修改 .rodata(Read Only Data) 常量区,存放全局常量 .data 数据段,存放已初始化的全局变量和静态变量 .bss(Block Started By Symbol) 未初始化数据段,存放未初始化的全局变量或者初始化为…

探秘Transformer系列之(5)--- 训练推理

从零开始解析Transformer,目标是:(1) 解析Transformer如何运作,以及为何如此运作,让新同学可以入门;(2) 力争融入一些比较新的或者有特色的论文或者理念,让老鸟也可以有所收获。探秘Transformer系列之(5)--- 训练&推理 0x00 概述 Transformer训练的目的是通过对输入…

124. 二叉树中的最大路径和(困难)

目录题目题解:后序遍历 题目二叉树中的 路径 被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回…

Windsurf AI编程工具

Windsurf AI编程工具实操指南目录一、环境搭建与核心功能安装与登录模型选择与配置中文环境配置二、开发全流程实操创建项目将api目录下的模型调用抽象为服务层三、避坑指南四、与Cursor对比结语安装包 一、环境搭建与核心功能 安装与登录 访问Windsurf官网下载适配版本,支持W…

让你搜索效率翻倍的技巧

本文是《最全面的浏览器教程》第五篇,介绍一些好用的搜索引擎技巧。​ 本文是《最全面的浏览器教程》第五篇,介绍一些好用的搜索引擎技巧。 上一篇文章推荐了很多好用的搜索引擎,但要用好它们,还得加上很多技巧:例如指定文件类型,排除某些内容,在指定域名内搜索等。 本文…

4. MySQL 逻辑架构说明

4. MySQL 逻辑架构说明 @目录4. MySQL 逻辑架构说明1. 逻辑架构剖析1.1 服务器处理客户端请求1.2 Connectors(连接器)1.3 第1层:连接层1.4 第2层:服务层1.5 第3层:引擎层1.6 存储层2. SQL执行流程2.1 MySQL 中的 SQL 执行流程2.2 MySQL8中SQL执行原理最后:1. 逻辑架构剖析…

无线充电

https://baijiahao.baidu.com/s?id=1809048563048631142&wfr=spider&for=pc 工信部放宽无线充电设备频率和功率限制,安卓厂商或加大无线充电功率,苹果则因Qi2.0标准频率与航空无线电导航业务冲突而调整。无线充电技术发展迅速,但仍需解决充电发热等问题。咱也就是说…