Tag: 语言律师

`sizeof` *真的*计算为`std :: size_t`吗? 它可以?

采取以下标准通道: [C++11: 5.3.3/6]: sizeof和sizeof…的结果是std::size_ttypes的常量。 [注: std::size_t是在标准头文件<cstddef> (18.2)中定义的。 – 注意] 现在: [C++11: 18.2/6]:typessize_t是一个实现定义的无符号整数types,它足够大以包含任何对象的字节大小。 当然,这段文字并不要求size_t是一个用typedef定义的types别名,但是由于它明确声明是由标准头文件<cstddef> ,所以我认为我们可以认为没有包含<cstddef>删除任何保证size_t应可用于程序。 但是,根据第一个引用,我们可以不pipe获取std::size_ttypes的expression式。 我们实际上可以certificate这两个事实 : int main() { typedef decltype(sizeof(0)) my_size_t; my_size_t x = 0; // OK std::size_t y = 1; // error: 'size_t' is not a member of 'std' } std::size_t对程序不可见,但是sizeof(0)仍然给我们一个? 真? 所以说5.3.3/6是否有缺陷 ,而且它实际上和std::size_tparsing为“相同的types”,而不是 std::size_t本身呢? 当然,如果std::size_t是一个types别名,那么这两个是一样的,但是,再次,实际上这是不需要的。

在C中是0是八进制还是小数?

我读过这个 。 它在C ++中是八进制的,在Java中是十进制的。 但是没有关于C的描述? 如果0是八进制还是十进制,会有什么区别? 这是面试官提出的问题。 我说不,我解释说,无论是八进制还是十进制都是0。 然后他问为什么它被认为是C ++中的八进制和Java中的十进制。 我说这是标准。 请让我知道C是什么? 它会有所作为吗? 为什么他们在不同的标准有所不同?

在C ++ 14中引入了哪些更改可能会破坏用C ++ 11编写的程序?

介绍 随着C ++ 14 (也就是C ++ 1y )标准接近终结,程序员必须问自己后向兼容性问题和相关问题。 这个问题 在这个问题的答案中指出,标准有一个专门的附录修改之间的变化信息。 如果前面提到的附录中的这些潜在问题能够得到解释,或许可以借助与那里提到的有关的任何正式文件,这将是有益的。 根据标准 :在C ++ 14中引入了哪些更改可能会破坏用C ++ 11编写的程序?

为什么constvariables有时不需要被lambda捕获?

考虑下面的例子: #include <cstdlib> int main() { const int m = 42; [] { m; }(); // OK const int n = std::rand(); [] { n; }(); // error: 'n' is not captured } 为什么我需要在第二个lambda中捕获n ,而在第一个lambda中不是m ? 我在C ++ 14标准中检查了第5.1.2节( Lambdaexpression式 ),但我无法find一个理由。 你能指出我的解释这一段吗? 更新:我观察到GCC 6.3.1和7(trunk)的行为。 在这两种情况下,Clang 4.0和5(trunk)都会失败并发生错误( variable 'm' cannot be implicitly captured in a lambda […]

是否保证执行memcpy(0,0,0)是安全的?

我对C标准不太了解,请耐心等待。 我想知道是否可以保证memcpy(0,0,0)是安全的。 唯一的限制,我可以find的是,如果内存区域重叠,那么行为是未定义的… 但是我们可以认为这里的内存区域是重叠的吗?

未定义的行为是否未被评估?

我对以下代码与一些同事存在分歧: int foo ( int a, int b ) { return b > 0 ? a / b : a; } 这段代码是否performance出未定义的行为? 编辑:分歧从什么似乎是过度急切的优化编译器,其中b > 0检查被优化出来的错误。

如果两个对象在一行中声明,那么它们按什么顺序构造?

假设一个类被定义为 class A { //….. }; 现在我正在创build两个对象 A a,b; a和b以什么顺序创build? 它是由标准定义的吗?

为什么在Python中使用双分号是SyntaxError?

我知道在Python中分号是不必要的,但是它们可以用来将多个语句塞进一行,例如 >>> x = 42; y = 54 我一直认为分号相当于换行符。 所以我有点吃惊( Twitter上的Ned Batchelder ),双分号是SyntaxError: >>> x = 42 >>> x = 42; >>> x = 42;; File "<stdin>", line 1 x = 42;; ^ SyntaxError: invalid syntax 我假设最后一个程序相当于x = 42\n\n 。 我本来以为分号之间的陈述是作为一个空行来处理的,一个空行。 显然不是。 为什么这是一个错误?

sizeof(T *)!= sizeof(const T *)?

我正在和老板讨论这个问题。 他们说“是的,他们可以是不同的。” 对于sizeof(T*) != sizeof(const T*)是否有可能sizeof(T*) != sizeof(const T*) ?

德摩根定律与重载操作符的优化

每个程序员都应该知道: ( 德摩根定律) 在某些情况下,为了优化程序,可能会发生编译器将(!p && !q)修改为(!(p || q)) 。 这两个expression式是等价的,对第一个和第二个expression式没有任何区别。 但是在C ++中,可能会重载操作符,重载操作符可能并不总是尊重这个属性。 所以这样转换代码实际上会修改代码。 如果编译器使用De Morgan's Laws ! , || 和&&超载?