【C语言深度解剖】关键字if&&else&&bool类型

大家好我是沐曦希💕


在这里插入图片描述

🎇if else 组合

🔭什么是语句

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

例如:

printf("haha\n");
int a = 10;
int b = 20;
int c = a + b; 

🎆什么是表达式

C语言中,用各种操作符把变量连起来,形成有意义的式子,就叫做表达式。
操作符:+,-,*,/,%,>,<,=,==…

int a = 10;
int b = 20;
if(a!=b);//a!=b就是一个表达式

🎡基本语法

语法结构:
//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;
}

C语言中0为假,非0为真。
if语句执行,先执行完成表达式的值,得到逻辑结果,在进行判定

#include<stdio.h>
int main()
{
	int a = 1;
	int b = 0;
	int c = -1;
	if (a)
	{
		printf("haha\n");
	}
	if (b)
	{
		printf("hehe\n");
	}
	if (c)
	{
		printf("hello world\n");
	}
	return 0;
}

在这里插入图片描述
if语句中:
1.先执行()中的表达式,得到真假结果(true,false,逻辑结果)
2.条件判定功能
3.进行分支功能

🎉if语句实现猜凶手

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个。
以下为4个嫌疑犯的供词:
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手

#include<stdio.h>
int main()
{
	int A = 0;
	int B = 0;
	int C = 0;
	int D = 0;
	for (A = 0; A <= 1; A++)
	{
		for (B = 0; B <= 1; B++)
		{
			for (C = 0; C <= 1; C++)
			{
				for (D = 0; D <= 1; D++)
				{
					if ((A+B+C+D==1)&&((A == 0) + (C == 1) + (D == 1) + (D == 0) == 3))
					{
						if (A == 1)
							printf("凶手是A\n");
						else if (B == 1)
							printf("凶手是B\n");
						else if (C == 1)
							printf("凶手是C\n");
						else if (D == 1)
							printf("凶手是D\n");
					}
				}
			}
		}
	}
	return 0;
}

在这里插入图片描述
代码二

#include<stdio.h>
int main()
{
   int killer = 0;
   //分别假设凶手是a,b,c,d,看谁是凶手时满足3个人说了真话,一个人说了假话
   for (killer = 'a'; killer <= 'd'; killer++)
   {
    if ((killer != 'a') + (killer == 'c') + (killer == 'd') + (killer != 'd') == 3)
     printf("凶手是:%c", killer);
   }
   return 0;
}

🚗bool 变量与"零值"进行比较

bool x = true/flase;

💫深入理解C 中 bool

C语言有没有bool类型?
c99之前,主要是c90是没有的,目前大部分书,都是认为没有的。因为书,一般都要落后于行业。
但是c99引入了_Bool类型(_Bool就是一个类型,不过在新增头文件stdbool.h中,被重新用宏写成了bool,为了保证C/C++兼容性)。

//测试代码1
#include<stdio.h>
#include<stdbool.h>
int main()
{

	bool ret = false;
	ret = true;
	printf("%d\n", sizeof(ret)); //vs2013,vs2019和 Linux中都是1
	return 0;
}

在这里插入图片描述
查看源码:

// stdbool.h
//
//      Copyright (c) Microsoft Corporation. All rights reserved.
//
// The C Standard Library <stdbool.h> header.
//
#ifndef _STDBOOL
#define _STDBOOL

#define __bool_true_false_are_defined 1

#ifndef __cplusplus

#define bool  _Bool//c99中是一个关键字哦,后续可以使用bool
#define false 0    //假
#define true  1    //真

#endif /* __cplusplus */

#endif /* _STDBOOL */

/*
* Copyright (c) 1992-2010 by P.J. Plauger. ALL RIGHTS RESERVED.
* Consult your license regarding permissions and restrictions.
V5.30:0009 */

理论上,表示真假,需要一个bit就够了,还是要取决于编译器的理解。
代码怎么写:因为目前编译器对C99特性支持的并不全面,我们后面依旧默认使用C90的认识去编码即可,使用int表示真假。
给别人介绍:c99之前,主要是c90是没有的,目前大部分书,都是认为没有的。

另一种bool类型

//测试代码2
#include<stdio.h>
#include<stdbool.h>
int main()
{
//在vs2013中,光标选中BOOL,单击右键,可以看到转到定义,就能看到BOOL是什么
	BOOL x = TRUE;//typedef int BOOl
	x = FALSE;
	printf("%d\n", sizeof(x));//输出结果是4,因为在源代码中,是这么定义的:typedef int BOOL;
	return 0;
}
//由微软自行定的标准,只能在微软的软件下使用,不推荐,因为可移植性较差。

在这里插入图片描述

/****************************************************************************
*                                                                           *
* minwindef.h -- Basic Windows Type Definitions for minwin partition        *
*                                                                           *
* Copyright (c) Microsoft Corporation. All rights reserved.                 *
*                                                                           *
****************************************************************************/
typedef int                 BOOL;

这都是Microsoft自己搞的一套BOOL值。
强烈不推荐,因为好的习惯是:一定要保证代码的跨平台性,微软定义的专属类型,其他平台不支持。

在Linux中(centos 7),测试代码1,是可以编过的(因为是标准啊),但是测试代码2就过不了。

[whb@VM-0-3-centos code]$ cat test.c //具有跨平台性
#include <stdio.h>
#include <stdbool.h>
int main()
{
   bool ret = false;
   return 0;
}
[whb@VM-0-3-centos code]$ gcc test.c //直接通过
[whb@VM-0-3-centos code]$ vim test.c
[whb@VM-0-3-centos code]$ cat test.c
#include <stdio.h>
#include <stdbool.h>
int main()
{
   BOOL ret = FALSE;
   return 0;
}
[whb@VM-0-3-centos code]$ gcc test.c //直接报错
test.c: In function ‘main’:
test.c:5:5: error: unknown type name ‘BOOL’
    BOOL ret = FALSE;
    ^
test.c:5:16: error: ‘FALSE’ undeclared (first use in this function)
    BOOL ret = FALSE;
               ^
test.c:5:16: note: each undeclared identifier is reported only once for each function it appears in

总结:

  1. 优先使用c90,就是我们之前以及后面一直用的方式
  2. 使用bool时,推荐c99标准。

🎆bool 值与0比较

#include <stdio.h>
#include <stdbool.h>
int main()
{
	int pass = 0; //0表示假,C90,我们习惯用int表示bool
	//bool pass = false; //C99
	if (pass == 0) { //理论上可行,但此时的pass是应该被当做bool看待的,==用来进行整数比较,不推荐
	//TODO
	}
	if (pass == false) { //不推荐,尽管在C99中也可行
	//TODO
	}
	if (pass) { //推荐
	//TODO
	}
	//理论上可行,但此时的pass是应该被当做bool看待的,==用来进行整数比较,不推荐
	//另外,非0为真,但是非0有多个,这里也不一定是完全正确的
	if (pass != 1) {
		//TODO
	}
	if (pass != true) { //不推荐,尽管在C99中也可行
	//TODO
	}
	if (!pass) { //推荐
	//TODO
	}
	return 0;
}
//bool类型,直接判定,不用操作符进行和特定值比较。

💥写在最后

你的❤️点赞是我创作的动力的源泉
你的✨收藏是我奋斗的方向
你的🙌关注是对我最大的支持
你的✏️评论是我前进的明灯
创作不易,希望大佬你支持一下小沐吧😘

评论 83
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

沐曦希

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

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

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

打赏作者

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

抵扣说明:

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

余额充值