C++ 如何使用断言函数

C++ 如何使用断言函数,c++,c,C++,C,什么是 assert( scanf("%d", &t) == 1 ); 及 assert(1assert不返回任何内容,如果参数为false,则程序将终止。assert适用于不应该发生的情况……但您只需在错误假设或类似情况下进行检查即可 Assert不返回任何内容,如果参数为false,则程序终止。Assert适用于不应该发生的情况……但您可以在错误假设或类似情况下进行检查 断言所做的是计算表达式,如果它计算的值与0/false比较,则程序终止 assert所做的是计算表达式,如果

什么是

assert( scanf("%d", &t) == 1 ); 


assert(1assert不返回任何内容,如果参数为false,则程序将终止。assert适用于不应该发生的情况……但您只需在错误假设或类似情况下进行检查即可


Assert不返回任何内容,如果参数为false,则程序终止。Assert适用于不应该发生的情况……但您可以在错误假设或类似情况下进行检查

断言所做的是计算表达式,如果它计算的值与0/false比较,则程序终止


assert所做的是计算表达式,如果其计算结果与0/false比较,则程序终止。

不要将assert与用户输入一起使用。assert旨在通过崩溃程序来捕获逻辑错误(如果断言失败,则调用abort),用户输入永远不会崩溃程序


但是为了回答您的问题,如果定义了NDEBUG,则assert不执行任何操作。这可能是程序未按预期崩溃的原因。

不要在用户输入中使用assert。assert用于捕获逻辑错误(如果断言失败,则调用abort)通过使程序崩溃,用户输入永远不会使程序崩溃


但是为了回答您的问题,如果定义了NDEBUG,那么assert什么也不做。这可能是您的程序没有按预期崩溃的原因。

您可以假设assert声明如下:

/*!
 * Immediately crash the program if assumption is proven invalid.
 */
void assert (bool assumption);
如果您“知道”变量
t
永远不会超出范围[1,10],因为是您编写的代码,并且您的代码无法生成任何其他值,则可以断言该语句

断言显而易见的事情 考虑以下断言的使用:

int t = 9;
assert (9 == t);   // A very valid assertion, if a little pedantic.
上面的代码应该看起来像是在陈述显而易见的东西真的,但更重要的是<强>其他任何结果都是疯狂的<强>。学习<代码> t!= 9 < /Cord>会消除所有关于C++如何工作的假设,计算机如何执行数学和存储值,不管我们存在还是意识是否只是由如此多的加重电子形成的幻觉…… 但这就是断言的价值所在

即便如此,计算机在所有实际用途中都是100%确定性的,“疯狂”的事情确实会发生。这也并不罕见。事实上,我们在代码中明确地写入断言,以检测这些情况,并给我们一个找出发生了什么的机会。这里考虑一些导致疯狂行为的现实原因

“疯狂”行为的原因 你的断言应该防止诸如

  • 线程同步不正确

    int t;
    
    // Thread 1
    t = 9;
    assert(t == 9);
    
    // Thread 2
    t = 3;
    assert(t == 3);
    
  • 内存管理不好

    class X {
        void sayHello () {
            assert(this != NULL);   // An object that does not exist cannot say hello.
            std::cout << "Hello?" << std::endl;
        }
    };
    
    // Without the assertion, this code would actually run!
    X* x = NULL;
    x->sayHello();
    

  • 此列表不完整,但它应该为您提供如何(以及如何不)应用断言的更广泛指导。

    您可以假设断言声明如下:

    /*!
     * Immediately crash the program if assumption is proven invalid.
     */
    void assert (bool assumption);
    
    如果您“知道”变量
    t
    永远不会超出范围[1,10],因为是您编写的代码,并且您的代码无法生成任何其他值,则可以断言该语句

    断言显而易见的事情 考虑以下断言的使用:

    int t = 9;
    assert (9 == t);   // A very valid assertion, if a little pedantic.
    
    上面的代码应该看起来像是在陈述显而易见的东西真的,但更重要的是<强>其他任何结果都是疯狂的<强>。学习<代码> t!= 9 < /Cord>会消除所有关于C++如何工作的假设,计算机如何执行数学和存储值,不管我们存在还是意识是否只是由如此多的加重电子形成的幻觉…… 但这就是断言的价值所在

    即便如此,计算机在所有实际用途中都是100%确定性的,“疯狂”的事情确实会发生。这也并不罕见。事实上,我们在代码中明确地写入断言,以检测这些情况,并给我们一个找出发生了什么的机会。这里考虑一些导致疯狂行为的现实原因

    “疯狂”行为的原因 你的断言应该防止诸如

  • 线程同步不正确

    int t;
    
    // Thread 1
    t = 9;
    assert(t == 9);
    
    // Thread 2
    t = 3;
    assert(t == 3);
    
  • 内存管理不好

    class X {
        void sayHello () {
            assert(this != NULL);   // An object that does not exist cannot say hello.
            std::cout << "Hello?" << std::endl;
        }
    };
    
    // Without the assertion, this code would actually run!
    X* x = NULL;
    x->sayHello();
    

  • 此列表不完整,但它应该为您提供如何(以及如何不)应用断言的更广泛指导。

    解决问题的正确方法是将
    scanf()
    函数封装在一个知道它在做什么的函数中:

    int AskNumberOfWidgetFrobs() {
      int count = 0;
      for(;;) // Until we get a valid number
        scanf("%d", &count);
         if (count > 0 && count <= 10) {
           return count;
        } else {
           printf("%d is not a valid number of WidgetFrobs\n", count);
        }
      }
    }
    
    int AskNumberOfWidgetFrobs(){
    整数计数=0;
    for(;;)//直到我们得到一个有效的数字
    scanf(“%d”、&count);
    
    如果(count>0&&count问题的正确解决方案是将
    scanf()
    函数封装在一个知道它在做什么的函数中:

    int AskNumberOfWidgetFrobs() {
      int count = 0;
      for(;;) // Until we get a valid number
        scanf("%d", &count);
         if (count > 0 && count <= 10) {
           return count;
        } else {
           printf("%d is not a valid number of WidgetFrobs\n", count);
        }
      }
    }
    
    int AskNumberOfWidgetFrobs(){
    整数计数=0;
    for(;;)//直到我们得到一个有效的数字
    scanf(“%d”、&count);
    
    如果(count>0&&count这是我所期望的答案:

    特别地

    #include <assert.h> 
    
    #包括
    
    在源文件开头的单独一行中

    现在,只要bool不是true,就可以使用assert(bool)终止程序


    (其他答案是关于“如何正确使用断言”的问题)

    这是我希望得到的答案:

    特别地

    #include <assert.h> 
    
    #包括
    
    在源文件开头的单独一行中

    现在,只要bool不是true,就可以使用assert(bool)终止程序


    (其他答案是关于“如何正确使用断言”的问题)

    从技术上讲,这是一个宏,不是一个函数。第一个检查用户输入是否为1,另一个检查范围是否在1到10之间included@MimiEAM,scanf
    的返回值是成功输入的项目数。除其他注释外,请注意,
    assert
    仅在调试模式下编译。如果议员