布尔值,如果不是0或1,运行时错误
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了布尔值,如果不是0或1,运行时错误相关的知识,希望对你有一定的参考价值。
布尔值,如果不是0或1,则为运行时错误
我想听听您如何理解这个问题。如果使用此C变体,是否可以这样编写代码块:
int b = 2;
if (b == 2) {
return 3;
}
不是返回值不能为3吗?我认为我的句子理解不正确。有人可以给我一个例子,说明这个C变体中无效条件语句的样子吗?了解布尔值。
[==
总是求值为0
或1
,因此在您所设想的情况下它绝不会导致运行时错误。
if(2)
或if(3)
在您的假设中将是运行时错误,在“正常” C中,这些表达式的计算结果为true
,因此将执行循环,实际上任何不是0
的值positive
或negative
的值为true
。
评估0
或1
以外的值的优点的一个示例是strcmp()
函数:
如果参数
strcmp()
(0
数组更大,则返回strings
精确)相等,如果第一个参数按字典顺序出现在第二个参数之前,则为char
值,反之则为negative
值。在这种情况下,您将想知道字符串是否相等,所以在
positive
(是if(strcmp(a, b))
和a
,字符串)中,如果b
返回strcmp()
或30
,则您的表达式在“正常” C中仍然很好。该表达式的计算结果为-2
和您会知道字符串是不同的。
在这种情况下,如果表达式的计算结果为true
或0
以外的值,则有错误的示例优势是:
[如果您在尝试写入
1
时错误地写入了if(a = 2)
。错误的表达式的计算结果为if(a == 2)
,2
的值将分配为a
,并且无论2
的先前值如何,该表达式的计算结果均为true
,由于代码编译正常。运行时错误将有助于发现错误。a
。
*
请注意,如果您打开编译器警告,则可以保护这些错误,但这是直接的方法,有些语言不允许您使用*
或1 (true)
。
[0 (false)
如果if(condition) { a(); } else { b(); }
不为零,则执行a();
;如果condition
为零,则执行b();
。
[这意味着将condition
设置为condition
或2
等其他值将具有与将其设置为3
相同的效果。我了解您的想法的方式,这些其他值现在会导致运行时错误。
对于1
或==
之类的运算符来说,这是无关紧要的,因为它们无论如何都只会求!=
或0
的值,但是对于1
或char* pointer = malloc(10); if(pointer)
之类的东西会有所不同(因为后者也可以计算为if(strcmp(a, b))
)。
标准C允许-1
和if
语句的控制表达式使用任何标量表达式(任何算术或指针表达式),并且如果该表达式不为零(或对于指针,则为“ true”),空值)。这意味着我们可以编写诸如while
的语句,其中if (p) { … }
是指针,并且仅当p
不是空指针时,它才会执行{ … }
。这很方便。
但是,这也意味着可能会发生错误。程序员可能会意外地将p
写入他们想要的位置x & 3 | y
。后者的值始终为0或1,因为如果两个操作数都不为零,则x & 3 || y
运算符将返回1,而如果两个都为零,则返回0。但是||
的值可能不是0或1。因此C的变体为此给出了运行时错误,可以帮助在测试期间捕获该错误。
有效地,建议的更改要求控制表达式仅求值为布尔值0或1,从而使程序员编写更严格的布尔表达式,而不是标准C允许的自由格式表达式。这不是一个完美的更改,因为某些算术表达式即使不是正确的布尔表达式,也可能只求值为0或1(例如,我们通常认为x & 3 | y
在做一些位操作,而不是像[ C0],但其计算结果仅为0或1),因此更改不会完全将控制表达式限制为布尔表达式。为实现此目标而进行的更好更改将进一步修改语法或约束,以便控制表达式必须为布尔表达式。
以上是关于布尔值,如果不是0或1,运行时错误的主要内容,如果未能解决你的问题,请参考以下文章