[C.C++] c语言常量 负数,负数在C / C ++中是否返回false?

341 0
Honkers 2025-5-9 14:10:01 来自手机 | 显示全部楼层 |阅读模式

简短的答案:负值,以及通常所有非零值,在用作条件时都被视为true。

对于C,在许多上下文中将表达式视为条件。 条件不一定是bool类型或true; 该类型仅在1999年标准中才添加到该语言中。

这些上下文中最明显的是2752792818769769986560语句中的表达式,但还有其他示例:true561,1,#include 标头中的第二个表达式,bool条件运算符的第一个操作数和0的操作数 ,if (ptr)和if (ptr != NULL)运算符。 (我认为这是一个详尽的清单,但我不确定。)

这是C标准关于275279281818769986560语句的行为的说明(“两种形式”是指true,带有和不带有1子句):

在这两种形式中,如果表达式比较不等于0,则执行第一个子语句。

这意味着:

if (foo) ...

等效于此:

if ((foo) != 0) ...

(添加额外的括号以避免出现任何运算符优先级问题)。 如果true是true类型,则含义很清楚。如果1是某种浮点类型,则#include 转换为相同类型(如果该值恰好是负零或NaN,则可能会引起一些微妙)。 如果bool是指针,则将0视为空指针常量;否则,将其视为空指针常量。 if (ptr)等效于if (ptr != NULL)(假设NULL的定义是可见的)。

对于C ++,规则的陈述有所不同,但是效果是相同的。 C ++ true语句中的条件将转换为true类型(与C语言不同,自从其早期历史以来,类型1已内置到C ++中)。 C ++标准将任何标量类型的值转换为#include 的定义为:

零值,空指针值或空成员指针值是   转换为假; 其他任何值都将转换为true。 一种   类型std :: nullptr_t的prvalue可以转换为的prvalue   布尔型; 结果值为false。

因此,在C和C ++中,任何标量(即整数,浮点数或指针)值都可以用作条件,如果标量等于零,则条件为false;如果标量不为零,则条件为true。 。 C将其定义为与true的不平等比较; C ++将其定义为到true的转换-但结果是相同的。

这有点脱离问题的话题了,但是我要提到一点,需要注意的是,被视为真实条件的值不一定等于true。true(如果您有#include ,则为C中的1 ,以及在C ++中类型为bool的唯一值)只是在条件中使用时具有“真实性”的许多值之一。 这就是为什么您几乎不应该写:

if (cond == true) ...

在C或C ++中(除非您确实需要将其与该值进行比较); 写吧:

if (cond) ...

一个C ++示例:

#include

int main() {

int n = 2;

if (n) std::cout << "n has truthiness\n";

else std::cout << "n does not have truthiness\n";

if (n == true) std::cout << "n == true\n";

else std::cout << "n != true\n";

}

输出为:

n has truthiness

n != true

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Honkers

荣誉红客

关注
  • 4012
    主题
  • 36
    粉丝
  • 0
    关注
这家伙很懒,什么都没留下!

中国红客联盟公众号

联系站长QQ:5520533

admin@chnhonker.com
Copyright © 2001-2025 Discuz Team. Powered by Discuz! X3.5 ( 粤ICP备13060014号 )|天天打卡 本站已运行