language-lawyer相关内容

return 语句后的序列点?

在我对问题的回答中 这里我解释了在与 return 语句在同一行的全局变量上使用后缀 ++ 时发生的情况. C11 的信息性附录 C 指出,在 return 之后有一个序列点,并参考规范性章节 6.8.6.4,其中没有关于序列点的文本. 我在 C 标准的哪里可以找到规范文本,说明在 return 语句之后有一个序列点? (我只在 7.1.4/3 找到了说明库函数的规范文本,作为一 ..
发布时间:2022-01-19 14:49:55 其他开发

当返回对象的函数在没有返回语句的情况下结束时会发生什么

在 C++ 中,当一个应该返回对象的函数在没有返回语句的情况下结束时会发生什么?返回什么? 例如 std::string func() {} 解决方案 返回什么? 我们不知道.根据标准,行为是未定义的. §6.6.3/2 返回声明[stmt.return]: (强调我的) 从构造函数、析构函数或具有 cv void 返回类型的函数的末尾流出等效于没有操作数的 ..
发布时间:2022-01-19 14:44:20 C/C++开发

是否使用 if (0) 跳过应该工作的开关中的一个案例?

我有一种情况,我希望 C++ switch 语句中的两种情况都落入第三种情况.具体来说,第二种情况会通过第三种情况,第一种情况也会通过第三种情况不通过第二种情况. 我有一个愚蠢的想法,尝试了它,它成功了!我将第二种情况包装在 if (0) { ... } 中.它看起来像这样: #ifdef __cplusplus# 包括 #别的# 包括 #万一诠释主要(无 ..
发布时间:2022-01-19 10:48:41 C/C++开发

大括号初始化列表和无符号类型

gcc 8 和 clang 7 不接受以下代码,它们应该默认构造一个 unsigned int 类型的临时代码: unsigned int ui = unsigned int{}; clang 7报错如 :6:22: error: 'unsigned' 之前的预期主表达式 Visual C++ 2015 和 2017 接受这一点. 显然,这适用于诸如 int 之类的类型,或任何默认可 ..
发布时间:2022-01-19 00:07:55 C/C++开发

写前读未定义分配内存?

根据 此 reddit 评论线程,如果尝试在写入之前读取内存.我指的是已成功 malloced. 的普通堆内存 ...请注意,这不是严格有效的 C:允许编译器/运行时系统使用所谓的陷阱表示来初始化未初始化的内存,这会导致访问时出现未定义的行为. 我觉得这很难相信.有标准报价吗? 当然,我知道无法保证内存已清零.此未初始化内存中的值本质上是伪随机或任意的.但我真的不敢相信标准会将此称 ..
发布时间:2022-01-19 00:07:47 其他开发

关于 C 中的数组初始化的困惑

在C语言中,如果这样初始化一个数组: int a[5] = {1,2}; 那么数组中所有未显式初始化的元素都将被隐式初始化为零. 但是,如果我像这样初始化一个数组: int a[5]={a[2]=1};printf("%d %d %d %d %d\n", a[0], a[1],a[2], a[3], a[4]); 输出: 1 0 1 0 0 我不明白,为什么 a[0] 打印的是 ..
发布时间:2022-01-18 23:52:24 其他开发

C++ 零初始化 - 为什么这个程序中的 `b` 未初始化,但 `a` 已初始化?

根据这个 Stack Overflow 问题的已接受(且唯一)答案, 定义构造函数 MyTest() = 默认值; 将对对象进行零初始化. 那为什么会出现以下情况, #include 结构富{foo() = 默认值;诠释一个;};结构栏{酒吧();诠释 b;};bar::bar() = 默认值;int main() {富一个{};酒吧 b{};std::cou ..
发布时间:2022-01-18 23:44:22 C/C++开发

在 C++11 中更改了默认初始化的含义?

C++2003 8.5/5 说: 默认初始化一个 T 类型的对象意味着: ——如果 T 是非 POD 类类型(第 9 条),则调用 T 的默认构造函数(初始化为如果 T 没有可访问的默认构造函数,则格式错误); ——如果 T 是一个数组类型,每个元素都是默认初始化的; ——否则,对象被零初始化. [强调添加.] C++2011 标准将最后一项更改为 —否则 ..
发布时间:2022-01-18 23:39:29 C/C++开发

初始化是否需要左值到右值的转换?是`int x = x;` UB吗?

C++ 标准在 3.3.2,“声明点"中包含一个半著名的“令人惊讶的"名称查找示例: int x = x; 这会用自身初始化x,它(作为原始类型)是未初始化的,因此具有不确定的值(假设它是一个自动变量). 这实际上是未定义的行为吗? 根据 4.1“左值到右值的转换",对未初始化的值执行左值到右值的转换是未定义的行为.右手的 x 是否进行了这种转换?如果是这样,该示例实际上是否具有未 ..
发布时间:2022-01-18 23:09:14 C/C++开发

声明嵌套命名空间`std`是否合法C++?

std 命名空间在 C++ 中是特殊的,所以 ... 这是合法的 C++ 吗? //在全局范围内命名空间我的{命名空间标准{...}} 我会说这很疯狂,但这是允许的吗? 来自标准的参考(或非参考)将不胜感激. 解决方案 在 reserved names 标准 17.4.3.1(及其子段落)中我找不到任何禁止使用 std 作为嵌套命名空间名称.它不是宏,不在全局命名空间中,而 ..
发布时间:2022-01-14 23:46:15 C/C++开发

如何将枚举导入 C++ 中的不同命名空间?

我在命名空间中有一个枚举,我想像在不同的命名空间中一样使用它.直觉上,我认为我可以使用“使用"或“类型定义"来完成此操作,但实际上都不起作用.证明它的代码片段,在 GCC 和 Sun CC 上测试: 命名空间 foo{枚举栏 {一个};}命名空间嗡嗡声{//这两种方法我用哪一种无所谓,//结果是一样的.使用 foo::bar;//typedef foo::bar bar;}主函数(){foo:: ..
发布时间:2022-01-14 23:28:17 C/C++开发

为什么“使用命名空间 X"?不允许在类/结构级别内?

C 类 {使用命名空间标准;//错误};命名空间 N {使用命名空间标准;//行}诠释主要(){使用命名空间标准;//行} 编辑:想知道背后的动机. 解决方案 我不太清楚,但我猜在类范围内允许这个可能会导致混乱: 命名空间你好{typedef int 世界;}类废话{使用命名空间你好;上市:世界 DoSomething();}//这应该只是 World 还是 Hello::World ..
发布时间:2022-01-14 22:55:01 C/C++开发

C 和 C++ 标准对位级整数表示和操作有什么看法?

我知道 C 和 C++ 标准没有规定数字的特定表示(可能是二进制补码、符号和大小等).但是我不太了解这些标准(并且无法找到是否有规定),无法知道在使用位时是否有任何特定的限制/保证/保留表示.特别是: 如果一个整数类型的所有位都为零,那么整个整数是否代表零? 如果整数类型中的任何一位为1,那么整数作为一个整体是否代表非零?(如果这是“是",那么符号和大小等一些表示将受到额外限制) 是否有 ..
发布时间:2022-01-14 14:45:54 C/C++开发

高效的无符号到有符号转换,避免实现定义的行为

我想定义一个函数,它接受一个 unsigned int 作为参数并返回一个 int 同余模 UINT_MAX+1 到参数. 第一次尝试可能如下所示: int unsigned_to_signed(unsigned n){返回 static_cast(n);} 但正如任何语言律师所知,对于大于 INT_MAX 的值,从无符号转换为有符号是实现定义的. 我想实现这一点,以便 ..
发布时间:2022-01-14 14:15:44 C/C++开发

Fortran:整数 * 4 与整数(4)与整数(种类 = 4)

我正在努力学习 Fortran,我看到很多不同的定义被传递,我想知道他们是否正在尝试完成同样的事情.以下有什么区别? 整数*4 整数(4) 整数(kind=4) 解决方案 在 Fortran >=90 中,最好的方法是使用内部函数来指定您需要的精度——这既保证了可移植性,又保证了您获得所需的精度需要.例如,要获得至少支持 8 个十进制数字的整数 i 和 my_int,您可以使用: ..
发布时间:2022-01-14 09:19:54 其他开发