【问题标题】:What does 'Conditional expressions can be only boolean, not integral.' mean?'条件表达式只能是布尔值,不能是整数。' 是什么意思?意思是?
【发布时间】:2011-03-03 15:36:48
【问题描述】:

什么是'条件表达式只能是布尔值,不能是整数。'意思是?我不知道 Java,我知道 C++ 并不足以理解它的含义。请帮助(在比较 C++ 和 Java 项 7 子项 1 中的 http://www.javacoffeebreak.com/articles/thinkinginjava/comparingc++andjava.html 中找到)

【问题讨论】:

  • 我真正喜欢 Java 的一点。
  • 实际上,将数字/指针解释为布尔值对于 C 和 C++ 等低级指针语言很有用。您的处理器没有布尔值这样的东西。 (嗯,有比较标志。)

标签: java c++ boolean integral conditional-expressions


【解决方案1】:

这意味着您需要一个布尔值作为条件,从整数类型的转换不会是隐式的。而不是if (x),你需要if (x != 0)等。

前者是一个int,它将在C++中隐式转换为bool(通过!= 0),但后一个表达式直接产生一个布尔值。

【讨论】:

    【解决方案2】:

    条件和循环控制结构使用条件表达式来确定程序的控制流程。

    // conditional control structure
    if (conditionalExpression) {
        codeThatRunsIfConditionalExpressionIsTrue();
    } else {
        codeThatRunsIfConditionalExpressionIsFalse();
    }
    
    // basic loop control structure
    while (conditionalExpression) {
        codeThatRunsUntilConditionalExpressionIsFalse();
    }
    
    // run-at-least-once loop control structure
    do {
        codeThatRunsAtLeastOnceUntilConditionalExpressionIsFalse();
    } while (conditionalExpression);
    

    从逻辑的角度来看,条件表达式本质上是布尔值(真或假)。但是,某些语言(如 C 和 C++)允许您使用数值表达式甚至指针作为条件表达式。当非布尔表达式用作条件表达式时,它们被隐式转换为与零的比较。例如,你可以这样写:

    if (numericalExpression) {
        // ...
    }
    

    这意味着:

    if (numericalExpression != 0) {
        // ...
    }
    

    这允许简洁的代码,尤其是在像 C 和 C++ 这样的指针语言中,空指针的测试非常普遍。然而,让你的代码简洁并不一定会让它更清晰。在 C# 或 Java 等高级语言中,不允许使用数值表达式作为条件表达式。如果你想测试一个对象的引用是否已经被初始化,你必须写:

    if (myObject != null) /* (myObject) alone not allowed */ {
        // ...
    }
    

    同样,如果你想测试一个数值表达式是否为零,你必须写:

    if (numericalExpression != 0) /* (numericalExpression) alone not allowed */ {
        // ...
    }
    

    【讨论】:

      【解决方案3】:

      在 C++ 中,你可以说if (someInt),它基本上等同于if (someInt != 0)。在 Java 中,只有第二种形式是合法的。

      【讨论】:

        【解决方案4】:

        拿下声明:

        if (a > b) {
            // Do stuff
        }
        

        “条件表达式”是a > b。在 C++ 中,你可以做类似的事情

        int i = foo();
        if (i) {
            // do stuff
        }
        

        这是因为整数(整数值)在 0 时被视为假,否则被视为真。 Java 等语言不允许您以这种方式将整数视为布尔值。

        【讨论】:

          【解决方案5】:

          积分表达式:

          int i = 5;
          if(i) {
            //...
          }
          
          //In C/C++, if(i) gets implicitly converted to if(i != 0), Java doesn't do this for you.
          

          布尔表达式

          int i = 5;
          if(i==5) {
            //...
          }
          
          //This will work in Java
          

          【讨论】:

            【解决方案6】:

            在 C/C++ 中你可以做到

            int i = 5;
            if( i ) { ...}
            

            在 Java 中你不能,因为 i 必须是布尔值

            【讨论】:

              【解决方案7】:

              这意味着,在 Java 中,布尔值“true”不能与整数值“1”(或者更准确地说,与任何非零整数)互换,布尔值“false”不能互换整数值“0”。

              【讨论】:

                【解决方案8】:

                表达式是计算值的代码。在这两种语言中,表达式都有一个静态类型,用于描述该表达式产生的值的种类。 Integral 表示表达式的类型是 int。

                简单地说,作者强调以下每一个都是合法的 C++ 代码,而不是合法的 Java 代码,因为 if 的表达式产生一个整数:

                if (32) {
                
                }
                
                if (2 * 17 - 33) {
                
                }
                
                int c;
                if (c = 12) {
                
                }
                

                【讨论】:

                  【解决方案9】:

                  换句话说:C/C++ 没有真正的布尔类型,它们只使用整数。 Java 确实有它们——而且,它的类型比 C/C++ 更严格。

                  【讨论】:

                  • C (C99) 和 C++ 都有内置的布尔类型。
                  • 不,不是。他们有一个头文件,将“bool”定义为int。
                  • 是的,真的 :) 对于 C99,请参阅:comeaucomputing.com/techtalk/c99/#bool,对于 C++:msdn.microsoft.com/en-us/library/tf4dy80a(VS.80).aspx
                  • 对,这正是我所说的:一个头文件(stdbool.h),将一个布尔值定义为一个int。
                  • C99:您在哪里看到 bool 定义为 int?它被定义为 _Bool,一个无符号整数类型,只能有两个值:0 和 1。那不是 int。 C++:它是一种内置类型。
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2023-03-03
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多