32个关键字详解①(C语言)

目录

关键字分类:

第一个C程序 - 补充内容

变量的定义与声明 - 补充内容

变量的分类 - 补充内容

变量的作用域 - 补充内容

变量的生命周期 - 补充内容

auto 关键字

register 关键字

static 关键字

static 修饰变量:

static修饰函数

sizeof 关键字

基本数据类型:

sizeof介绍:

signed、unsigned 关键字

整型在内存中的存储:

大小端 补充

整型取值范围

if else 关键字

什么是语句:

什么是表达式:

if else 语句:


关键字分类:

C语言中总共有多少个关键字呢?一般我们所见的书上都是32个,但是这些书是按照C90或C89的标准,其实C99后又新增了5个关键字,不过我们目前的主流编译器,对C99的支持并不好,接下来我们主要按照C90标准来讲解,即认为32个关键字!接下来我们先简单看一下这32个关键字:

下面我们一个一个的来详解这32个关键字 

在了解之前我们得深入认识理解一些知识:

第一个C程序 - 补充内容

以代码的形式解释说明:

//编写第一个C程序"hello world"
#include <stdio.h>
int main()
{printf("hello world!\n");return 0;
}
//运行程序的方式,当然可以用vs直接启动
//当然,也可以在vs项目中,找到代码生成的二进制可执行程序,双击即可。
//所以:我们的角色是写代码,编译器的角色是把文本代码变成二进制可执行程序。
//双击?不就是windows下启动程序的做法吗?
//那么启动程序的本质是什么呢?就是将程序数据,加载到内存中,让计算机运行!

变量的定义与声明 - 补充内容

因为有些关键字是用来修饰变量的,我们在介绍关键字之前,先来深度了解一下变量!

什么是变量(是什么)?

        在内存中开辟特定大小的空间,用来保存数据!

如何定义变量(怎么用)?

        int x =10;

        char c='a';

        double d=3.14;

        类型 变量名 = 默认值;

为什么要定义变量?

        计算机是为了人类计算能力不足的问题而诞生的,即,计算机是为了计算的。而计算,就需要数据,而在计算的时候,任何一个时刻,不是所有在内存中的数据立马被计算,有时部分数据是不参与运算的,而不需要计算的数据就要被临时的保存起来,等待后续处理,而这些数据我们用变量保存!以供我们后续的使用,使用那个数据就拿取其对应的变量即可!

变量定义的本质

        我们知道:1、程序运行需要加载到内存。2、程序计算需要使用变量。那么定义变量的本质就是:在内存中开辟一块空间,用来保存数据(为何一定要保存到内存?因为定义变量也是程序逻辑的一部分,程序已经加载到内存中了,所以变量是在内存中定义的!)

变量声明的本质

        通俗一说就是提前告诉编译器我定义了一个变量!

注意:定义只能有一次,而声明可以有多次!

变量的分类 - 补充内容

局部变量:

        包含在代码块也就是大括号{}中的变量叫做局部变量,局部变量具有临时性。进入代码块,自动形成局部变量,出了代码块自动释放!

全局变量:

        在所有函数外定义的变量,叫做全局变量,全局变量具有全局性!

代码块:

        用{}括起来的区域,就是代码块

上代码:

#include <stdio.h>
int g_value = 20;//全局变量
int main()
{//main函数也是函数,也有{}代码块!int a = 10;//局部变量printf("%d\n", a);return 0;
}

变量的作用域 - 补充内容

作用域的概念:

        变量的作用域指的是该变量可以被正常访问的代码区域!

局部变量的作用域:

        作用域也就是该变量的作用范围,通俗点说就是该变量只能在定义它的代码块{}内使用,而出了代码块就不能使用了!

全局变量的作用域:

        全局变量具有全局性,在整个程序运行期间都有效,作用于整个程序!

上代码:

//局部变量
//只作用于本代码块{}
#include <stdio.h>
int main()
{int x = 10;if (x == 10) {int y = 20;printf("局部: x: %d, y: %d\n", x, y);//y只能在本代码块内有效}printf("局部: x: %d, y: %d\n", x, y); //报错,y不能被访问return 0;
}//全局变量
//作用于整个程序
#include <stdio.h>
int sum = 100;//全局变量
void test(void)
{printf("test 全局:%d\n", sum);
}
int main()
{printf("main 全局:%d\n", sum);test();return 0;
}//全局变量和局部变量命名冲突时
#include <stdio.h>
int a_b = 25;//全局变量
int main()
{int a_b = 30;printf("%d\n", a_b);//30//局部变量和全局变量命名冲突时,优先使用局部变量!//强烈不建议这样写return 0;
}

变量的生命周期 - 补充内容

生命周期:

        指的是该变量从定义到释放的时间范围,所谓释放,指的是曾经开辟的空间被释放!

局部变量的生命周期:

        进入代码块,形成局部变量也就是开辟空间,生命周期开始,退出代码块,释放 局部变量,生命周期结束!

全局变量的生命周期:

        定义完成之后,程序运行的整个生命周期内,该变量一直有效!

生命周期通俗点讲,可以理解为变量存活的时间,局部变量的作用域跟生命周期都是在出了代码块就失效了,也就是出代码块就死了,而全局变量的生命周期就是整个程序结束才失效!

        

auto 关键字

最宽宏大量的关键字-auto

一般定义在代码块中的变量,即局部变量,默认都是由auto修饰的,不过省略不写!auto关键字一般默认修饰局部变量,而全局变量不是默认auto 修饰的!注意:我们所听到的,局部变量,自动变量,临时变量,都是一回事,我们统称为局部变量!

上代码:

#include <stdio.h>
//全局变量不是默认auto修斯的
auto int g_va = 100;//vs编译器会有警告int main()
{//局部变量默认都是由auto修饰的不过一般省略不写auto int a = 10;//auto修饰局部变量ifor (auto int i = 0; i < 10; i++) {printf("i=%d\n", i);if (1){//auto修饰局部变量jauto int j = 0; //自动变量printf("before: j=%d\n", j);j += 1;printf("after : j=%d\n", j);}}return 0;
}

register 关键字

最快的关键字 - register

在了解register关键字的作用之前,我们得先了解寄存器的概念!

寄存器:

        计算机中cpu主要是负责计算的硬件单元,但是为了方便运算,一般第一步需要先把数据从内存读取到cpu内,那么也就需要cpu具有一定的数据临时存储能力!注意:cpu并不是当前要计算的时候才把特定的数据读到cpu里面,那样太慢了。所以现在的cpu内,都集成了一组叫做寄存器的硬件,用来做临时数据的保存!通俗一点讲,就是把常用的数据放到寄存器中,或者是将快要计算的数据拿到寄存器中,然后cpu直接从内部的寄存器中使用,这样速度更快,效率高!

寄存器存在的本质:

        在硬件层面上,提高计算机的运算效率,因为不需要在内存中读取数据了,速度块! 

register 修饰变量

        尽量将所修饰的变量,放入CPU寄存区中,从而达到提高效率的目的!register关键字是修饰变量的,那么怎样的变量,可以采用register修饰呢?

register可修饰的变量:

1、修饰局部变量(不可修饰全局变量,全局会导致CPU寄存器长时间被占用)

2、不会被写入的变量(写入就继续写会内存,而register是优化到寄存器中的)

3、高频读取使用的(提高效率)

4、 如果要使用不要大量使用,寄存器数量有限!

注意:register 修饰的变量不能被取地址(因为register修饰的变量会被存放在寄存区中,而地址的概念是对于内存而言的,所以不能取地址)!

上代码:

#include <stdio.h>
int main()
{//用register 修饰变量//尽量将所修饰的变量放入寄存区中,//注意尽量这个词,说明也有可能没有被放到寄存区中,还是存放在内存中register int s = 20;printf("%d\n", s);register int a = 0;printf("&a = %p\n", &a);//编译器报错:错误 1 error C2103: 寄存器变量上的“&”//注意,这里不是所有的编译器都报错,目前我们的vs2019是报错的。//有些编译器不报错的原因是,有可能修饰的变量没有被优化到寄存区中//还是存放在内存中,所以可以取地址!return 0;
}

建议:在实际应用中,该关键字不用管,因为现在的编译器已经很智能了,能够进行比人更好的代码优化。早期编译器是因为需要认为指定register,来进行手动优化,现在不需要了,现在的编译器会自动给你优化好,且优化能力比人为更好!

static 关键字

static - 最名不符实的关键字

认识多文件:

        在C程序中我们可以定义多个源文件,但在源文件之间函数和全局变量是可以跨文件访问的,跨文件访问的前提是需要在使用的文件或者是在头文件中进行声明之后才可以访问,然而函数可以不进行声明直接访问但是会有警告!

上代码:

//定义两个源文件,让其跨文件访问//test.c文件里的代码
#include <stdio.h>int g_value = 100;//全局变量
int a = 200;//全局变量void show(void)//函数
{printf("hehe\n");
}//main.c文件里的代码
#include <stdio.h>
//extern int a = 200;//声明的时候不可进行赋值操作!会报错
extern int g_value;//声明全局变量
extern void show(void);//声明函数
int main()
{show();//不用声明也可跨文件访问,但会有警告//声明了就没有警号printf("%d\n", g_value);//声明之后才可跨文件访问return 0;
}

对于上述代码我们其实还可以优化,直接用一个头文件来声明函数、全局变量...等,在用的时候只需要让源文件包含该头文件即可

上代码:

//创建一个头文件来声明我们所需要的数据
//再创建两个源文件,进行交互操作//test.h 头文件的内容
#pragma once //防止头文件被重复包含
#include <stdio.h>
#include <string.h>
extern int g_value;//声明全局变量
extern void show(void);//声明函数//test.c 文件的内容
#include "test.h"//包含头文件int g_value = 100;//全局变量
int a = 200;//全局变量void show(void)//函数
{printf("hehe\n");
}//main.c文件的内容
#include "test.h"//包含头文件
int main()
{show();printf("%d\n", g_value);//声明之后才可跨文件访问return 0;
}

两个结论:

1、全局变量:是可以跨文件,被访问的!

2、全局函数:是可以跨文件,被访问的!

为什么会跨文件访问?

        因为有一定规模的项目,一定是多文件来写的,多个文件之间,后续是一定是要进行数据”交互“的也就是互相使用的,为了很好的让多个文件的数据进行交互,所以必须是能够跨文件访问的。如果不能跨文件访问,交互的成本就比较高了,总之为了更好的实现交互,所以就得跨文件访问!

static 修饰变量:

修饰全局变量:

        该全局变量只能在本文件内被使用!static修饰全局变量改变的是其作用域,全局变量的生命周期是不变的!

上代码:

//创建一个头文件来声明我们所需要的数据
//再创建两个源文件,进行交互操作//test.h 头文件的内容
#pragma once //防止头文件被重复包含
#include <stdio.h>
extern void he(void);//声明函数//test.c 文件的内容
#include "test.h"//包含头文件
static int g_va = 300;//全局变量
void he(void)
{printf("%d\n", g_va);//只能在本文件内使用,影响的是其作用域
//不能被其它文件直接使用,但可以被间接的使用!
}//main.c文件的内容
#include "test.h"//包含头文件
int main()
{//printf("%d\n", g_va);//不能直接使用static修饰的全局变量会报错//可以通过函数调用间接使用he();return 0;
}

​​​​

修饰局部变量:     

        static修饰局部变量,改变的是变量的生命周期,不改变其作用域,将局部变量的临时生命周期,改为全局生命周期!但作用域没改变!通俗点说,就是让局部变量存活的更久,但使用的时候只能在,它所在的{}代码块中使用!

static修饰局部变量的本质:

        我们先来了解一张布局图:

static修饰的局部变量会被放到全局数据区内,但具体放到那个区域是由编译器决定的,而全局数据区内的变量,在整个进程中生命周期都是有效的,即static修饰局部变量,改变其生命周期! 

上代码:

#include <stdio.h>
void fun1()
{//没有任何修饰//每次函数调用都会给变量开辟空间//函数结束空间会被释放!int i = 0;i++;printf("no static: i=%d\n", i);
}
void fun2()
{//用static修饰//函数在第一次调用的时候开辟好空间//后续调用的时候不再开辟空间//函数结束也不会被释放//生命周期变为全局生命周期//作用域没变,只能在函数的{}代码块内使用static int i = 0;i++;printf("has static: i=%d\n", i);
}
int main()
{for (int i = 0; i < 10; i++) {fun1();fun2();}return 0;
}
//结论:static修饰局部变量,变量的生命周期变成全局周期。(作用域不变)

static修饰函数

static修饰函数:

        其实跟修饰全局变量类似,被修饰的该函数,只能在本文件内使用,不能被其它文件直接访问!改变的是其作用域,生命周期不变!也就是将全局范围的作用域,改为局部范围的作用域!虽然不能被其它文件直接访问,但可以被间接访问!

上代码:

//创建一个头文件来声明我们所需要的数据
//再创建两个源文件,进行交互操作//test.h 头文件的内容
#pragma once //防止头文件被重复包含
#include <stdio.h>
extern void poos(void);//声明函数
extern void ass(void);//声明函数//test.c 文件的内容
#include "test.h"//包含头文件
static void poss(void)
{printf("static修饰的poss函数调用(访问)成功\n");printf("static修饰函数只能在本文件test.c内使用,不能被其它文件直接访问!\n");printf("但是可以被其他文件间接访问\n");
}void ass(void)
{printf("通过ass函数内部调用static修饰的poss函数\n");poss();
}//main.c文件的内容
#include "test.h"//包含头文件
int main()
{//poss();//static修饰的函数 不能被其它文件直接访问,会报错ass();//通过ass函数间接访问static修饰的poss函数return 0;
}//结论:static修饰函数,该函数只能在本文件中使用,改变的是其作用域

sizeof 关键字

基本数据类型:

在C语言中有内置类型,以及我们自定义的类型!

数据类型介绍:

 

如何看待数据类型:

前面说过定义变量的本质是:在内存中开辟一块空间,用来保存数据!然而定义一个变量是需要数据类型的,这个是基本语法决定的。那么类型决定了:变量开辟空间的大小!

为什么要存在数据类型?

        有一个问题:为什么要根据数据类型,开辟一块空间,直接使用内存整体不好吗?

答案:不好,因为在计算机中,程序运行需要加载到内存,而在任何时刻都不是你的一个程序在运行,还有很多其它程序也在运行,假设你的程序运行用了整块内存,那其它程序就无法正常运行了。另外还有一点,假设你整块内存都用了,但是你基本上全部空间都用不完,站在计算机的角度来说,给你空间你用不完,就是浪费!最好的解决方法就是一个程序用多大的空间,计算机就给它合理安排多大的空间使用。

那么问题又来了,一个程序使用内存,使用多大空间是由什么决定的呢?

        其实就是你的使用场景决定的,你的计算场景,决定了你使用什么类型的变量进行计算。你所使用的类型决定了你所开辟的空间大小!

sizeof介绍:

sizeof也是C语言的关键字,同时它也是一个操作符,它的作用就是用来计算数据类型以及变量等...所占空间的大小单位是字节!注意:sizeof是一个操作符,不是函数!

sizeof用途:

我们知道定义变量的本质是:在内存中开辟一块空间,用来保存数据,而定义一个变量是需要类型的,类型决定了,变量开辟空间的大小,而sizeof就可以帮我们计算出它所开辟的空间的大小单位是字节!

上代码:

#include <stdio.h>int main()
{//计算每种数据类型的大小单位是字节//%zd是sizeof操作符匹配的占位符!//当然%d也是可以打印出来的//%u也是可以的printf("%zd\n", sizeof(char)); //1printf("%zd\n", sizeof(short)); //2printf("%zd\n", sizeof(int)); //4printf("%zd\n", sizeof(long)); //4printf("%d\n", sizeof(long long)); //8printf("%d\n", sizeof(float)); //4printf("%u\n", sizeof(double)); //8return 0;
}

sizeof和函数的书写区别

        sizeof在计算变量以及自定义类型的大小的时候是允许不带括号的!而函数就必须要有括号,总之sizeof是一个操作符,不是函数

上代码:

//定义一个结构体
struct AA
{int a;float b;char c;
};int main()
{//计算结构体的大小printf("%zd\n", sizeof(struct AA));//必须带括号//定义结构体变量struct AA s = { 0 };//可以带括号,也可不带printf("%zd\n", sizeof(s));//带括号printf("%zd\n", sizeof s);//不带括号int a = 10;printf("%zd\n", sizeof(a));printf("%zd\n", sizeof a);//对于类型必须带括号printf("%zd\n", sizeof(int));printf("%zd\n", sizeof(float));printf("%zd\n", sizeof(double));return 0;
}

sizeof 在数组中运用:

        1、sizeof(数组名):表示整个数组的大小

上代码:

#include <stdio.h>int main()
{//定义一个整型数组int arr[] = { 1,2,3,4,5 };//用sizeof计算整个数组的大小printf("%d\n", sizeof(arr));//表示整个数组的大小!printf("%d\n", sizeof arr);//sizeof计算数据类型的时候要带括号其它情况下后面也可以不带括号return 0;
}

signed、unsigned 关键字

整型在内存中的存储:

signed 表示有符号,unsigned 表示无符号!

有符号整数 和 无符号整数介绍:

 原反补的概念:

        我们知道一个变量的创建是要在内存中开辟空间的,空间的大小是根据类型而决定的!那么数据在所开辟的空间中如何存储的呢?

有符号数:

        定义两个变量:int a=20; int b=-10;  我们知道编译器对变量a和b分别开辟4个字节的空间!那么这些数值该如何存储呢?

       首先,对于有符号数,一定要能表示该数据是正数还是负数。所以我们一般用最高比特位来进行充当符号位。

原码、反码、补码 :

计算机中的有符号数有三种表示方法,即原码、反码和补码。 三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位三种表示方法各不相同。

如果一个数据是负数,那么就要遵守下面规则进行转化:

原码:直接将二进制按照正负数的形式翻译成二进制就可以。

反码:将原码的符号位不变,其他位依次按位取反就可以得到了。

补码:反码+1就得到补码。

如果一个数据是正数:

那么它的原反补都相同。

无符号数:

不需要转化,也不需要符号位,原反补相同。

对于整形来说:

数据存放内存中其实存放的是补码。

取数据:

我们从开辟的空间里面取数据的时候,因为空间里面存的是二进制的补码,我们取的时候要显示的原码,所以在取的时候,有符号数和无符号数也略有差异!

对于有符号数:

如果该数是一个负数:先将补码转为原码,补码转原码的方法有两种:第一种是:将原码转补码倒着回去:让补码-1得到反码,再让反码符号位不变其它位按位取反得到原码。第二种是:重新让补码再走一遍原码转补码的过程:让补码符号位不变其他位按位取反得到一个二进制序列,再让这个二进制序列+1得到原码!

如果该数是一个正数:正数的原码、反码、补码,相同,直接不加转换的取出来即可!

对于无符号数:

取得时候压根不关心符号位,它的最高位也是数值位,空间中放的是什么二进制序列,就将这个二进制序列的符号位当作数值位直接取出来!

上代码:

#ifndef _CRT
#define _CRT
#include <stdio.h>
#endifint main()
{//数据的存:signed int a = 20;//20是正整数// 正数的原,反,补相同!// 原码就是补码!//补码:0000 0000 0000 0000 0000 0000 0001 0100//内存中存的就是补码signed int b = -10;//-10是负数//原码:1000 0000 0000 0000 0000 0000 0000 1010//反码:1111 1111 1111 1111 1111 1111 1111 0101//补码:1111 1111 1111 1111 1111 1111 1111 0110//内存中存的是补码// unsigned int c = -10;//c是一个无符号数 空间里面存放的是-10的补码//数据的取:printf("%d\n", a);//%d是以有符号的形式取,将有符号数a取出来结果还是20printf("%d\n", b);//b是负数,取得时候补码转成原码//补码转原码//方法一:先 - 1,在符号位不变,按位取反。//方法二:将原码到补码的过程在来一遍。printf("%u\n", c);//%u是无符号的形似取,直接将空间里的二进制序列转出数值!//把该二进制的符号位当作是数值位直接取//也就是将-10的补码,且将符号位看成数值位直接取出来!printf("%d\n", c);//然而以%d有符号的形式取的时候,取出来的是-10//但会有警告return 0;
}

深入理解变量内容的存入和取出:

代码形式注释说明:

#include <stdio.h>
int main()
{signed int b = -10;unsigned int d = -10; //(是否合的)printf("%d\n", b);//取得时候补码转回原码printf("%u\n", d);//取得时候直接将补码当成数值取出来,不考虑符号位!//结论://存:字面数据必须先转成补码,在放入空间当中。//所以,所谓符号位,完全看数据本身是否携带+-号。和变量是否有符号无关!//取:取数据一定要先看变量本身类型,然后才决定要不要看最高符号位。如果不需要,直接二进制转成十进制。// 如果需要,则需要转成原码,然后才能识别。(当然,最高符号位在哪里,又要明确大小端)return 0;
}

十进制二进制快速转换:

        1后面跟几个0就是2的几次方!

上代码:

        

#include <stdio.h>
int main()
{int a = 10;//10可以分解为:8+2  等同于 2^3 + 2^1//根据口诀 2的几次方就是1后面有几个0//10的二进制原码:1010//补齐32比特为:0000 0000 0000 0000 0000 0000 0000 1010return 0;
}

为什么存的都是补码?

        在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理; 同时,加法和减法也可以统一处理(CPU只有加法器)。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

大小端 补充

大小端其实就是对数据的不同存储方式产生的两种存储方式,全称是:大端字节序存储 和 小端字节序存储!

因为计算机厂商的不同,对于内存设计的存储方式不同,所以才会产生两种不同的存储方式:大端存储和小端存储!

大小端是如何存储:

        我们知道数据有高权值为和低权值位之分,打个比方:存在数字123,则数字1是权值最高的位,而3是权值最低的位!内存也有高地址和地址之分。在存储的时候是将数值按照字节为单位存入到内存中的!

小端字节序存储:

        数据的低权值位存到内存的低地址处,高权值位存到高地址处(数据倒着存)

大端字节序存储:

        数据的高权值位存到内存的低地址处,低权值位置存倒高地址处(数据顺着存)

画图理解:

 

数据的取:

1、先考虑大小端

        按照大(小)端存进去,就按照大(小)端取出来,也就是怎么存进去就怎么取出来!

2、在看变量的类型

        以何种方式取,就按照那种方式来解读存进去的这段二进制序列!

整型取值范围

为了方便介绍:这里使用char类型来介绍,char也是整型家族的一员!

char又分为unsigned char 和 signed char 两种!

signed char的取值范围:-128~127

为什么?

        我们知道char类型的数据在内存中占1个字节,也就是8个比特位!而signed char 是有符号的char所以在8个比特位中最高的那个比特位表示符号位(1表示负数,0表示正数)剩余的7位才是数值位!然而它的取值范围其实就是8个二进制位的排列组合!解析如下:

 

unsigned char 的取值范围:0~255

为什么?

        char类型的数据占1个字节也就是8个比特位,unsigend char是无符号的char 所以压根就不考虑符号的问题,8个二进制位都是数值位。按照排列组合可知:取值范围就是 0~255

解析:

几道经典题目:

 以代码的形式注释讲解:

第一题:

#include <stdio.h>
#include <string.h>int main()
{char a[1000];int i;for (i = 0; i < 1000; i++){a[i] = -1 - i;}printf("%d", strlen(a)); //strlen函数碰到'\0'就结束 '\0'的ASICC码值是0//答案是255//解析:// 当i=0,a[0] = -1+(-i)=-1// 当i=1,a[1] = -1+(-1)=-2// 当i=2,a[2] = -1+(-2)=-3// 当i=3,a[3] = -1+(-3)=-4// 当i=4,a[4] = -1+(-4)=-5// .........// 因为a数组是有符号char类型的// 当i=128,a[128] = -1+(-128)=127 // 当i=129,a[129] = -1+(-129)= -1+(-128)+(-1)=126  // 当i=130,a[130] = -1+(-130)=125 // ......// 当i=255,a[255] = -1+(-255)=0//而'\0'的ASICC值是 0 strlen遇到0就停止,计算0之前的个数//就是:255return 0;
}

第二题:

#include <stdio.h>int main()
{int i = -20;unsigned int j = 10;printf("%d\n", i + j);//-20原码:10000000 00000000 00000000 00010100//-20反码:11111111 11111111 11111111 11101011//-20补码:11111111 11111111 11111111 11101100// 正数的原、反、补相同//10的补码:00000000 00000000 00000000 00001010
//-20+10的补码:11111111 11111111 11111111 11110110
//-20+10的反码:10000000 00000000 00000000 00001001
//-20+10的原码:10000000 00000000 00000000 00001010  -10
}

第三题:

#include <stdio.h>int main()
{unsigned int i;for (i = 0; i >= 0; i++) {printf("%u\n", i);}
//unsigned int 是无符号整数 取值范围是:0 ~ 4294967295
//而无符号数在任何情况下都是>=0的,是一个死循环!
//当i++到4294967295的时候再+1 取到的结果又是0,所以是死循环!return 0;
}

if else 关键字

什么是语句:

在C语言中由一个分号;隔开的就是一条语句!

上代码:

#include <stdio.h>
int main()
{int a = 10;//这是一条语句printf("%d\n", a);//这是一条语句int b = 0; char c = 0;//这是两条语句return 0;
}

什么是表达式:

C语言中,用各种操作符把变量或数值连起来形成有意义的式子,就叫做表达式!

操作符:+,-,*,/,%,<,>,=,==  ......等!

上代码:

#include <stdio.h>
int main()
{int a = 10l;int b = 20;int c = 30;int d = 28;char e = 'a';float f = 3.25f;float ret = a + b + c + d + e;//这就是一条表达式printf("%f\n", ret);return 0;
}

if else 语句:

选择语句!

语法结构:
1.单分支:

if (表达式)语句;

2.双分支:

if (表达式)语句1;
else语句2;

3. 多分支:

if (表达式1)语句1;
else if (表达式2)语句2;
else语句3;

4. 嵌套:

if (表达式1) 
{语句1;if (表示式x) {语句x;} else{语句y;}
} 
else if (表达式2)
{语句2;
} 
else
{语句3;
}

执行顺序:

        1、求出表达式的结果

        2、执行判断功能

        3、执行分支功能

先计算条件表达式的结果,若结果为真则执行语句1,为假执行语句2,(在C语言中数字0表示假,非0数字表示真!)

上代码:

//先计算括号里面的表达式的结果,通常用1表示真,0表示假//再执行选择功能,看要执行那一块的代码//最后再执行分支功能执行代码#include <stdio.h>
int main()
{//单分支int a = 10;if (a == 10){printf("a==%d\n", a);}//双分支int b = 20;if (10 == b){printf("b == 10\n");}else{printf("b != 10\n");}//多分支int c = 30;if (10 == c){printf("c == 10\n");}else if(20 == c){printf("c == 20\n");}else{printf("c != 10 && c!=20\n");}//嵌套int d = 40;if (50 > d){if (40 == d){printf("d == 40\n");}else{printf("d < 50\n");}}else if (d > 50){if (d == 60){printf("d == 60\n");}}else{printf("d的值为:%d\n", d);}return 0;
}

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

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

相关文章

docker私有仓库-harbor的搭建

docker 官方提供的私有仓库 registry&#xff0c;用起来虽然简单 &#xff0c;但在管理的功能上存在不足。 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器&#xff0c;harbor使用的是官方的docker registry(v2命名是distribution)服务去完成。harbor在docker di…

全排列+力扣

题目 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 题目描述 代码实现 class Solution {vector<vector<int>> ret;vector<int> path;bool used[7]; public:vector<vector<int>> permute(vector<int>& nums) {_permute(nums…

C++_包装器

目录 1、包装器的用法 2、包装器的类型 3、包装器的作用 4、包装成员函数 5、bind&#xff08;绑定&#xff09; 5.1 bind的用法 5.2 bind减少参数个数 结语 前言&#xff1a; C11的包装器&#xff0c;总称为function包装器&#xff0c;而包装器又称适配器…

allegro PCB设计心得笔记(二) -- ERROR(SPMHUT-144): Illegal arc specification

使用Allegro PCB Editor设计PCB&#xff0c;其中使用了中文丝印&#xff0c;设计完成后&#xff0c;进行Tools -> Database Check&#xff0c;提示如下错误&#xff1a; 对PCB文件进行反复检查&#xff0c;也没有找到具体问题&#xff0c;但是删除中文丝印封装后&#xff0c…

vue3 uniapp 项目初始化集成配置【开箱即用】

https://gitee.com/charrie/vue3-uniapp-init 技术说明 采用vue3viteuniapp技术栈&#xff0c;setup语法糖编码方式引入unocss量子化样式引擎&#xff0c;动态css不用自己写样式&#xff0c;引用class即可&#xff0c;降低代码体积全局请求入口已封装&#xff0c;使用时自己封…

宝塔面板配置网站通过ip地址+端口,页面刷新无效。nginx反向代理后端端口。添加/xxx文件然后再访问项目。

宝塔面板配置网站通过ip地址端口&#xff0c;页面刷新无效。nginx反向代理后端端口。添加/xxx文件然后再访问项目。 一般来说vue项目build打包以后 如果 直接发布服务器 并且不使用后端接口。 是不需要配置nginx的。 假设我vue部署好了。我的ip是106.66.66.66. 但是我页面里面…

PLC数据采集网关是如何应用的?-天拓四方

PLC数据采集网关通过以太网、串口等通信接口与PLC设备连接&#xff0c;实现数据的实时采集。网关内置数据处理模块&#xff0c;可以对采集到的数据进行清洗、转换和存储&#xff0c;以满足不同应用场景的需求。同时&#xff0c;PLC数据采集网关支持多种通信协议&#xff0c;如M…

1.Spring核心功能梳理

概述 本篇旨在整体的梳理一下Spring的核心功能,让我们对Spring的整体印象更加具体深刻,为接下来的Spring学习打下基础。 本片主体内容如下: Bean的生命周期依赖注入的实现Bean初始化原理推断构造方法原理AOP的实现这里要说明一下,我们这里说到的Spring,一般指的是Spring F…

基于Java (spring-boot)的房屋租赁系统

一、项目介绍 有以下模块 角色&#xff1a;用户、管理员、房东 管理员&#xff1a;个人中心、房屋类型管理、房屋信息管理、预约看房管理、合同信息管理、房屋报修管理、房屋评价管理、系统管理 用户:个人中心、房屋信息管理、预约看房管理、合同信息管理、房屋报修管理、房屋…

差分逻辑电平 --- LVDS、CML、LVPECL互连

前言 首先了解差分逻辑电平结构&#xff0c;也包括单端逻辑电平 地址&#xff1a;常见的逻辑电平_常用的逻辑电平-CSDN博客 注&#xff1a;ECL >> PECL >> LVPECL演变而来&#xff1b;QDR&#xff08;Quad Data Rate):四倍数据倍率 本文章只涉及差分逻辑电平:LVDS…

在dpvs上实现ICMP的源进源出

目录 1. 缘起2. 源码分析3. 让ICMP也走源进源出1. 缘起 在网络通信中,当一个请求报文从源主机到达目标主机,并经过中间路由器或交换机进行转发时,请求报文进入主机A的路径和响应报文离开主机A的路径可能不同。这种情况下,就会出现所谓的三角路径问题。如下图: 具体来说,…

C++第二弹---C++入门(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】 C入门 1、函数重载 1.1、函数重载概念 1.2、C支持函数重载的原理--名字修饰(name Mangling) 3、引用 3.1、引用概念 3.2、引用特性 3.3、常引用 …

批量PDF转HTML:高效管理与优化文档格式

随着数字化时代的快速发展&#xff0c;PDF文件因其跨平台兼容性和良好的排版效果而被广泛应用。然而&#xff0c;在文本批量管理的场景中&#xff0c;我们可能需要将PDF文件转换为HTML格式&#xff0c;以便更好地进行编辑、搜索和定制。本文将为您介绍一种高效的方法&#xff0…

Java线程的基本操作

线程的基本操作 Java线程的常用操作都定义在Thread类中&#xff0c;包括一些重要的静态方法 和线程的实例方法 。下面我们来学习一下&#xff0c;线程的常用基本操作 1.线程名称的设置和获取 线程名称可以通过构造Thread的时候进行设置&#xff0c;也可以通过实例的方法setName…

NOIP2018-S-DAY1-3-赛道修建(洛谷P5021)的题解

目录 题目 原题描述&#xff1a; 题目描述 输入格式 输出格式 输入输出样例 主要思路&#xff1a; check&#xff1a; 真正的code: 原题描述&#xff1a; 题目描述 C 城将要举办一系列的赛车比赛。在比赛前&#xff0c;需要在城内修建 条赛道。 C 城一共有 个路…

rancher里的ingress如何配置gzip压缩

方案一&#xff0c;未试验成功&#xff0c;但配置过程值得记录一下 通过配置configmap&#xff0c;然后在ingress的deployment里引用configmap实现。 参考文章 创建configmap apiVersion: v1 kind: ConfigMap metadata:name: nginx-ingress-controllerannotations:{} # k…

WPF Button去除按钮边框,添加下划线

<Button Width"45" Height"25" FontSize"20" Background"Transparent" BorderBrush"Transparent" Foreground"#FFC9A322" Click"Btn_Retry_Click" ><TextBlock><Underline>重试</…

01_lombok review

文章目录 Lombok父子工程ide中的Maven基础配置前置知识储备 Lombok 怎么引入Lombok依赖&#xff1a; step1&#xff1a;引入Lombok依赖 eg&#xff1a; <dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok<…

数据库管理-第159期 Oracle Vector DB AI-10(20240311)

数据库管理159期 2024-03-11 数据库管理-第159期 Oracle Vector DB & AI-10&#xff08;20240311&#xff09;1 其他distance函数2 实例演示使用其他函数寻找最近向量点函数变体简写语法 总结 数据库管理-第159期 Oracle Vector DB & AI-10&#xff08;20240311&#x…

网络安全AI智能体公司「云起无垠」获数千万元天使+轮融资,致力于大模型与网络安全深度融合的技术研究

「云起无垠」致力于打造最懂安全的AI智能体&#xff0c;通过持续运营的工具、知识以及记忆引擎&#xff0c;不断提升智能体对用户安全场景的理解&#xff0c;以达到易于使用、自我学习、自主行动的特性&#xff0c;助力企业自动化执行各类安全任务&#xff0c;让软件更安全&…