【C++grammar】断言与表达式常量

目录

  • 1、常量表达式和constexpr关键字
  • 2、断言与C++11的静态断言
    • 1.1. assert : C语言的宏(Macro),运行时检测。
    • 1.2. assert()依赖于NDEBUG 宏
    • 1.3. assert 帮助调试解决逻辑bug (部分替代“断点/单步调试”)
    • 2.1static_assert (C++11的静态断言 )
    • 2.2. 作用:编译时断言检查
    • 2.3. static_assert的用途
    • 3. 1When to use assertions (何时使用断言)
  • 3、声明与定义
    • 1. What is "Declare/Declaration" (什么是声明)
    • 2. What is "define/definition" (什么是定义)
    • 3. Differences between a declaration and a definition (定义与声明的区别)

1、常量表达式和constexpr关键字

常量表达式是编译期间就能计算其结果的表达式。
const修饰的对象既可能是编译期常量,也可能是运行期常量。
constexpr说明符声明可在编译时计算函数或变量的值

constexpr int max(int a , int b) { // c++11 引入 constexprif (a > b) return a;   // c++14才允许constexpr函数中有分支循环等else       return b;
}
int main() {int m = 1;const int rcm = m++;   // rcm是运行期常量const int cm = 4;      // 编译期常量,等价于: constexpr int cm = 4;int a1[ max(m , rcm)]; // 错误:m & rcm 不是编译期常量std::array<char , max(cm , 5)> a2; // OK: cm 和 5 是编译期常量 
}

const用来告知程序员const指向的内容不可被修改,主要目的是为了避免写出bug。
constexpr在所有编译期常量的地方做限定。使得constexpr修饰的语句在编译期即可计算得到值。让编译期优化代码性能。
constexpr修饰的函数,要满足什么条件才能成为编译期常量表达式?
constexpr 函数的返回值必须在编译时就能被确定。

2、断言与C++11的静态断言

断言是一条检测假设成立与否的语句。
断言assert是一个宏,而非一个函数。
static_assert 是一个关键字,而非一个函数。

1.1. assert : C语言的宏(Macro),运行时检测。

用法:包含头文件 以调试模式编译程序

//assert( bool_expr ); // bool_expr 为假则中断程序
std::array a{ 1, 2, 3 };  //C++17 类型参数推导
for (size_t i = 0; i <= a.size(); i++) {assert(i < 3);  //断言:i必须小于3,否则失败std::cout << a[ i ];std::cout << (i == a.size() ? "" : " ");

在这里插入图片描述

1.2. assert()依赖于NDEBUG 宏

NDEBUG这个宏是C/C++标准规定的,所有编译器都有对它的支持。
(1) 调试(Debug)模式编译时,编译器不会定义NDEBUG,所以assert()宏起作用。
(2) 发行(Release)模式编译时,编译器自动定义宏NDEBUG,使assert不起作用
如果要强制使得assert()生效或者使得assert()不生效,只要手动 #define NDEBUG 或者 #undef NDEBUG即可。

1.3. assert 帮助调试解决逻辑bug (部分替代“断点/单步调试”)

#undef NDEBUG   // 强制以debug模式使用<cassert>
int main() {int i;std::cout << "Enter an int: ";std::cin >> i;assert((i > 0) && "i must be positive"); return 0;
}

上面示例的第6行代码中,若assert中断了程序则表明程序出bug了!程序员要重编代码解决这个bug,而不是把assert()放在那里当成正常程序的一部分
assert断言中所用的表达式可以不是是编译期常量表达式。

2.1static_assert (C++11的静态断言 )

2.1. static_assert ( bool_constexpr, message)

其中两个参数解释如下:
(1)      bool_constexpr:   编译期常量表达式,可转换为bool 类型
(2)      message: 字符串字面量 ,是断言失败时显示的警告信息。自C++17起,message是可选的

2.2. 作用:编译时断言检查

// 下面的语句能够确保该程序在32位的平台上编译进行。
// 如果该程序在64位平台上编译,就会报错 (例子来自MSDN)

static_assert(sizeof(void *) == 4, "64-bit code generation is not supported.");

2.3. static_assert的用途

常用在模版编程中 ,对写库的作者用处大
在static_assert的第一个参数 bool_constexpr 中不能有变量表达式

3. 1When to use assertions (何时使用断言)

这里我们指的是assert,运行期的断言。
若某些状况是你预期中的,那么用错误处理;若某些状况永不该发生,用断言)

int n{ 1 } , m{ 0 };
std::cin >> n;
assert((n != 0) && "Divisor cannot be zero!"); // 不合适
int q = m / n;
int n{ 1 } , m{ 0 };
do {                // 这是修补bug的代码std::cin >> n;    // 断言失败后,要解决这个bug
} while (n == 0);   // 在这里编写修复bug的代码
assert((n != 0) && "Divisor cannot be zero!");
int q = m / n;

下面的例子说明了在编译期,静态断言就已经执行了,因为array<int,nums>的nums在编译期就应该知道它的值。
在这里插入图片描述

3、声明与定义

1. What is “Declare/Declaration” (什么是声明)

“声明”是引入标识符并描述其类型,无论是类型,对象还是函数。编译器需要该“声明”,以便识别在它处使用该标识符。

extern int bar;extern int g(int, int);double f(int, double); // extern can be omitted for function declarationsclass foo; // no extern allowed for type declarations

2. What is “define/definition” (什么是定义)

“定义”实例化/实现这个标识符。链接器需要“定义”,以便将对标识符的引用链接到标识符所表示的实体。

int bar;int g(int lhs, int rhs) {return lhs*rhs;}double f(int i, double d) {return i+d;}class foo {};

3. Differences between a declaration and a definition (定义与声明的区别)

1、定义有时可取代声明,反之则不行
2、标识符可被声明多次,但只能定义一次
3、 定义通常伴随着编译器为标识符分配内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377832.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一些又用的国内著名期刊

记&#xff1a; 电子学报、电子与信息学报、图像图形学报、自动化学报、计算机学报、软件学报、计算机研究与发展。转载于:https://www.cnblogs.com/nanyangzp/p/3322244.html

一、Arduino UNO R3将数据上传至云平台

一、准备工作 ①ESP12E Shield ②Arduino UNO R3开发板 ③把ESP12E Shield安装到Arduino UNO R3开发板上 ④登录物联网平台注册个账号&#xff0c;到时候需要使用。 ⑤记录下来你的Uid和key到时候会用到 ⑥创建个设备&#xff0c;用于测试 ⑦beyondyanyu为设备名&…

怎样做一个快乐的ASP.NET程序员

首先我想解释一下标题中两个关键字: "快乐", "ASP.NET程序员". 有的人想成为一个"杰出"的程序员, 或者"资深"的程序员, 简单来说就是"大牛"级的人物 -- 但是本文不是针对此种发展方向不是说我不鼓励大家朝这方向走, 而是对我…

__eq___C ++'and_eq'关键字和示例

__eq__"and_eq" is an inbuilt keyword that has been around since at least C98. It is an alternative to & (Bitwise AND Assignment) operator and it mostly uses for bit manipulations. “ and_eq”是一个内置关键字&#xff0c;至少从C 98起就存在。 它…

leetcode 93. 复原IP地址 思考分析

题目 给定一个只包含数字的字符串&#xff0c;复原它并返回所有可能的 IP 地址格式。 有效的 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 ‘.’ 分隔。 例如&#xff1a;“0.1.2.201” …

二、通过云平台反向控制Arduino UNO R3

该篇博文是在第一篇博文(一、Arduino UNO R3将数据上传至云平台)的基础上进行的 一、云平台发送指令反向控制Arduino UNO R3 ESP12E Shield开关都推到OFF&#xff08;要不然下载会报错&#xff09;&#xff0c;往Arduino UNO R3开发板上下载下面的代码 这段代码进行测试要点&…

使用MSBuild编译FsLex项目

FsLex FsYacc微软本身也提供了一个项目模板。但是这个项目模板是lex和yacc文件均包含。我想只适用lex&#xff0c;但是如果每次使用命令行也觉得不够方便&#xff0c;于是还是研究了一番MsBuild的使用。 使用msbuild hellp.fsproj /v:d 可以查看整个msbuild的流程&#xff0c;非…

Python字符串格式:%vs.format

Often the string formatters in python are referred to as old style and new style. The old-style is % and .format is known as the new style. python中的字符串格式化程序通常被称为旧样式和新样式。 旧样式为&#xff05; &#xff0c;. format被称为新样式。 Simple…

【C++grammar】代理构造、不可变对象、静态成员

目录1、Delegation Constructor&#xff08;代理构造&#xff09;1. What is delegating constructor? (什么是代理构造/委托构造)2. Avoiding recursive calls of target constructors (避免递归调用目标ctor)3. 委托构造的好处2、不可变对象和类1、如何让类成为“不可变类”…

paip.最新的c++ qt5.1.1环境搭建跟hello world

paip.最新的c qt5.1.1环境搭建跟hello world 作者Attilax &#xff0c; EMAIL:1466519819qq.com 来源&#xff1a;attilax的专栏 地址&#xff1a;http://blog.csdn.net/attilax 有一段时间没接触c了...今天下载新的qt下来研究一番.. qt的环境搭建有eclipseqtdtmingwqtl…

RFID模块+WIFI模块+振动传感器+有源蜂鸣器+舵机+Arduino UNO R3所构成的门禁系统模块

该系统模块主要由RFID模块WIFI模块振动传感器有源蜂鸣器舵机Arduino UNO R3组成的门禁系统模块。这里使用舵机充当门锁&#xff0c;用户可以刷卡开门&#xff0c;也可以通过APP控制舵机状态达到开门的效果。若有不法分子想要强行进入室内&#xff0c;对门进行撞击或者人为的破坏…

PushManager

http://suchandalex.googlecode.com/svn/trunk/beOui/beWe/client/Classes/PushNotificationManager.m转载于:https://www.cnblogs.com/vincent-lu/archive/2012/01/18/2325740.html

krsort_PHP krsort()函数与示例

krsortPHP krsort()函数 (PHP krsort() function) krsort() function is used to sort an associative array in descending order based on the keys, as we know that an associative array contains keys and values, this method sorts an array according to the keys. kr…

ESP12E Shield+Arduino UNO R3开发板+DHT11温湿度模块+双色LED灯+有源蜂鸣器+光敏电阻模块+I2CLCD1602液晶显示器所构成的室内检测系统

室内检测系统由ESP12E ShieldArduino UNO R3开发板DHT11温湿度模块双色LED灯有源蜂鸣器光敏电阻模块I2CLCD1602液晶显示器所构成。DHT11温湿度模块获取室内温湿度数据通过I2CLCD1602液晶显示器进行显示&#xff0c;另一方面通过ESP12E Shield将数据上传至云平台。光敏电阻进行捕…

输入输出函数:

一、printf函数&#xff1a;     printf("Hello World!\n");     printf("My age is %d\n",26);     int age 17;     printf("My age is %d\n",age);  %d 或 %i: 带符号 十进制整数。   %o:不带符号 八进制整数。   %x:…

leetcode 202. 快乐数 思考分析(哈希集合与双指针解)

1、题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为&#xff1a;对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和&#xff0c;然后重复这个过程直到这个数变为 1&#xff0c;也可能是 无限循环 但始终变不到 1。如果 可以变为 1&am…

五、线性回归和多项式回归实现

官网API 一、线性回归 针对的是损失函数loss faction Ⅰ、Lasso Regression 采用L1正则&#xff0c;会使得w值整体偏小&#xff1b;w会变小从而达到降维的目的 import numpy as np from sklearn.linear_model import Lasso from sklearn.linear_model import SGDRegresso…

JavaScript中的地图与对象

JavaScript对象与地图 (JavaScript Objects vs Maps) Objects are super popular in JavaScript so its not a term you are hearing for the first time even if youre a novice JS developer. Objects, in general, are a very common data structure that is used very ofte…

深发展银行编码器(解剖)

电池拆下来&#xff0c;再装上&#xff0c;还能继续用下&#xff0c;不会被重置 转载于:https://www.cnblogs.com/ahuo/archive/2012/01/25/2329485.html

关于$.getJson

这是一个Ajax函数的缩写&#xff0c;这相当于: 123456$.ajax({dataType: "json",url: url,data: data,success: success});数据会被附加到一个查询字符串的URL中&#xff0c;发送到服务器。如果该值的data参数是一个普通的对象&#xff0c;它会转换为一个字符串并使用…