三值结构

2020-07-31 00:02:44

有时我们有一个布尔值,它非常适合存储两个值,但是我们只需要多一点空间来挤入第三个值。有几种方法可以做到这一点。一种常见的技术是使用整数。0代表假,1代表真,-1代表神秘的另一个。例如,我们可能会考虑要点多少墨西哥玉米煎饼。任何低于100的午餐听起来都很棒,但超过100似乎就太过分了。然而,玉米煎饼的负数简直是无稽之谈。Intsimplecheck(Int X){if(x<;0)return-1;if(x<;100)return 1;return 0;}voidtestfunc(Int Input){if(!simplecheck(Input))死机(";错误输入";);}。

遗憾的是,如上所述,这很容易受到常见错误的影响,即只检查false,并将未知和true都视为true。纠正此问题的最简单方法是将0指定为正确的情况。如果有人意外地将我们的三值大布尔值视为真正的布尔值,我们希望分区保持好值和坏值之间的分离。借用严格结构的技巧,我们可以将一些结构文字用于我们的值。不幸的是,C不允许直接测试结构相等性,所以我们使用指针。Struct triebee{int v;};struct triebee*isok=&;(Struct Triebee){0};struct triebee*notokay=&;(Struct Triebee){1};struct triebee*noimage=&;(Struct Triebee){-1};struct triebee*check(Int X){if(x<;0)return nodea;if(x<;100)return is ok。}voidfunc(Int Input){if(check(Input)!=isok)死机(";坏蜜蜂";);}。

为什么要使用结构?以避免混淆来自多个检查函数的返回代码。Tyfinf int intcode;intcode*intokay=&;(Intcode){0};intcode*intad=&;(Intcode){1};intcode*intmissing=&;(Intcode){-1};tyfinf int floatcode;floatcode*floatok=&;(Floatcode){0};floatcode*floatad=&;(Floatcode){1};floatcode*floatrange=&;(Floatcode){-1};int*intcheck(Int X){if(x<;0)return intMissing;if(x<;100)return intokay;return intpad;}voidbadfunc(Int Input){if(intcheck(Input)==floatok)Panic(";no no";);}。

在这里,我们意外地试图将要订购的玉米煎饼数量的验证与价格检查的结果代码进行比较,我们曾经如此明智地选择用浮点数来表示。无论如何,如果我们完全错过了支票,所有这些都会失败。我们的check函数从不返回NULL,但是遗憾的是,它仍然可以编译。更严格地说,我们可以使用不带指针的结构。Struct Three beee Goodbee={0};struct Three beebee={1};struct Three beebee nobee={-1};struct Three beebeecheck(Int X){if(x<;0)return nobee;if(x<;100)return badbee;return Goodbee;}voidnoCompile(Int Input){if(!beecheck(Input))Panic(";FAIL";);如果(beecheck(Input)!=Goodbee)死机(";FAIL";);}。

然而,编译器之神不会批准这种用法。一方面将我们从错误中拯救出来,但当我们想要这样做的时候,我们也不能很好地发挥。我们需要一个宏。这看起来有点过分,但等等,情况会变得更糟。您只知道接下来会有人编写这个宏。现在,我们遇到了与开始时相同的问题,即只检查单个故障条件。所有这些大惊小怪,都是徒劳的。所以这是一个曲折的循环。编译器在这里为我们提供了有限的帮助。但是我们可以进行简单的更改,使用0表示成功。在问题(Int X){if(x<;0)return-1;if(x<;100)return 0;return 1;}void shoudBuy(Int Input){if(HasProblems(Input))Panic(";no buy";);}中出现问题(Int X){if(x<;0)return-1;if(x<;100)return 0;return 1;}。

如果我们需要的话,可以使用更精确的返回代码,但是我们将成功和失败很好地划分到了布尔划分的两边。快速检查的行为方式很明显。如果一致性要求返回代码必须绝对为true才能成功,则可以添加另一个参数来回传解释。这不太容易引起混淆。Boolareyousure(int x,struct triebee*whynot){if(x<;0){*whynot=nobee;return false;}if(x<;100)return true;*whynot=badbee;return false;}。

在我看来,这可能比必要的更复杂。只要记住,在设计API时,0可能会成为更好的成功指示器就足够了。然而,对于那些已经在世界上松散的人来说,已经太晚了。

发布时间:2020年7月29日06:20更新时间:2020-07-29 06:24已标记:C编程