首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C标准是否明确表示真值为0或1?

C标准是否明确表示真值为0或1?
EN

Stack Overflow用户
提问于 2016-05-18 14:19:26
回答 3查看 34.3K关注 0票数 94

我们知道,在C中,任何不等于0的数字都被视为true,所以我们可以这样写:

代码语言:javascript
复制
int a = 16;

while (a--)
    printf("%d\n", a);  // prints numbers from 15 to 0

但是,我想知道在C中是否将true / false定义为1/0,所以我尝试了以下代码:

代码语言:javascript
复制
printf("True = %d, False = %d\n", (0 == 0), (0 != 0));  // prints: True = 1, False = 0

C标准是否将true和false的真值分别明确表示为10

EN

回答 3

Stack Overflow用户

发布于 2016-05-19 00:25:51

我已经用多种语言编写过程序。我见过true是1还是-1取决于语言。true being 1背后的逻辑是一个比特要么是0要么是1。true being -1背后的逻辑是!运算符是一个补码。它在一个int中把所有的1改成了0,把所有的0改成了1。因此,对于int,!0 = -1且!(-1) = 0。这已经足够让我犯错了,我不会将某些东西与==进行比较,而是将其与!= false进行比较。这样,我的编程风格就可以在每种语言中运行。所以我的回答是不要担心它,而是编程,让你的代码在任何一种情况下都能正确工作。

票数 3
EN

Stack Overflow用户

发布于 2016-05-18 14:30:20

这是由于您的printf语句中的关系运算符造成的。

Operator ==和operator !=

由于(0 == 0)保持为真,因此它会给出值1

但是,(0 != 0)不是真的,所以给出值为0

票数 1
EN

Stack Overflow用户

发布于 2016-05-19 00:48:56

这个答案需要更仔细地研究一下。

C++中的实际定义是,任何非0的内容都被视为真。为什么这是相关的?因为C++不知道整数是什么--我们创造了它的含义,它所容纳的只是外壳和规则。它知道构成整数的位是什么。

1作为整数是松散的比特表示,比方说8位带符号的int表示为0000 0001。很多时候,我们在视觉上看到的是一种谎言,-1是一种更常见的方式来表示它,因为“整数”的有符号性质。1真的不能表示真正的正确,为什么?因为它不是11111110的操作。对于布尔型来说,这是一个非常重要的问题。当我们讨论布尔值时,它只有1位--这真的很简单,0表示假,1表示真。所有的逻辑操作都是微不足道的。这就是为什么对于整数(带符号),'-1‘应该被指定为'true’。1111 1111 NOT‘’ed变成0000 0000-逻辑成立,我们是好的。Unsigned it有点棘手,在过去更常用--1表示true,因为很容易暗示“任何不是0的都是true”的逻辑。

这就是解释。我认为这里公认的答案是错误的--在C/C++定义中没有明确的定义。布尔值是布尔值,您可以将整数视为布尔值,但输出是整数这一事实并不说明实际正在执行的操作是按位执行的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37291681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档