小编Sne*_*tel的帖子

i ==(i = 2)的结果是什么?

运行以下代码:

// In Java, output #####
public static void main(String[] args) {
    int i = 1;

    if(i == (i = 2)) {
        System.out.println("@@@@@");
    } else {
        System.out.println("#####");
    }
}
Run Code Online (Sandbox Code Playgroud)

但:

// In C, output @@@@@?I did test on Clion(GCC 7.3) and Visual Studio 2017
int main(int argc, char *argv[]) {
    int i = 1;

    if(i == (i = 2)) {
        printf("@@@@@");
    } else {
        printf("#####");
    }

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

提出这个问题的动机来自以下代码:

// The code is from the JDK 11 - java.util.concurrent.atomic.AtomicInteger …
Run Code Online (Sandbox Code Playgroud)

c java side-effects variable-assignment language-lawyer

44
推荐指数
3
解决办法
3068
查看次数

c ++类可以将自己包含为成员吗?

我试图通过在C++中编写python例程来加速它,然后使用ctypes或cython来使用它.

我是c ++的新手.我正在使用Microsoft Visual C++ Express,因为它是免费的.

我计划实现一个表达式树,以及一个以后缀顺序评估它的方法.

我遇到的问题是:

class Node {
    char *cargo;
    Node left;
    Node right;
};
Run Code Online (Sandbox Code Playgroud)

我无法宣布leftright作为Node类型.

c++

41
推荐指数
3
解决办法
3万
查看次数

为什么不允许在constexpr函数中转到?

C++ 14规定了constexpr函数中可以做什么和不可以做什么.其中一些(不asm,没有静态变量)似乎很合理.但该标准也不允许gotoconstexpr功能,尽管它允许其他控制流机制.
这种区别背后的原因是什么?
我以为我们过去了" goto很难编译 ".

c++ goto language-lawyer constexpr c++14

22
推荐指数
1
解决办法
892
查看次数

通过球体的联合近似实体

我有一个3D实体,表示为一组多面体凸壳的联合.(或者单个凸起,如果这样可以使事情变得更容易.)我想将该实体近似为一组球体的并集,以最小化集合中球体的数量和近似中的误差.(后一个目标是刻意模糊的:任何合理的误差度量都可以.同样,目标组合的方式在空中;要么球体的数量或误差度量可能受到限制,要么两者的某些功能可以最小化.我不想把自己指定到一个角落.)

近似值不需要完全包含原始集合完全包含在原始集合中.每个球体可以具有任意半径.

这感觉就像NP完全的问题,并且在任何情况下都不太可能使用精确方法,所以我假设解决方案在于随机优化领域.感觉k-means的某些变体可能适合(将未覆盖的位置分配给它们最近的球体,并精炼球体以覆盖其中的一些),但我不确定如何处理多重覆盖的位置,或者如何找到局部的,不一定是覆盖 - 即使对于单个球体也是最佳的.此外,对于迭代方法,效率很重要,并且执行3D布尔操作不会有效.

mathematical-optimization approximation convex computational-geometry

18
推荐指数
2
解决办法
881
查看次数

C11中的匿名结构和联合被错误地描述了吗?

关于匿名结构和联合,遵守C标准:

6.7.2.1 p13. 类型说明符是没有标记的结构说明符的未命名成员称为匿名结构; 一个未命名的成员,其类型说明符是一个没有标记的联合说明符,称为匿名联合.匿名结构或联合的成员被视为包含结构或联合的成员.如果包含的结构或联合也是匿名的,则递归应用.

注意强调:而不是匿名struct/union的成员在包含struct/union 的范围内,它们是它的完全成员.但是有责任:

6.7.2.1 p16.联合的大小足以包含其最大的成员.最多一个成员的值可以随时存储在union对象中.指向适当转换的union对象的指针指向其每个成员(或者如果成员是位字段,则指向它所在的单位),反之亦然.

总而言之,这些似乎意味着(命名)联合中的匿名结构的成员表现得像联合的共同位置,相互排斥的成员.所以以下应该有效:

union Foo
{
    struct
    {
        char a;
        char b;
    };
};

int main(void) {
    union Foo f;
    assert(&f == &(f.a) && &f == &(f.b));
}
Run Code Online (Sandbox Code Playgroud)

当然,它没有,我们也不希望它......如果他们像上面那样工作,那么没有理由建立匿名结构/联盟.尽管如此,该标准在这一点上似乎毫无疑问.有什么我想念的吗?

c language-lawyer c11

17
推荐指数
1
解决办法
552
查看次数

有效地检测有理数是相等的

我有许多有理数的集合,每个有的分子和分母存储为一个大的(数百或数千位)无符号整数.我希望能够有效地测试a/b集合中任何给定的有理数是否等于集合中的任何其他有理数c/d.

a*d == b*c当然,最直接的方法是测试是否比计算完整产品更有效.

关于我的特定用例的一些注释:

  • 我将测试的对很可能实际上是相等的(因为我已经预先计算并首先通过它们的浮点近似来比较它们),所以如果它们不相等的早期外出将不会为我节省很多时间.
  • 我很好地预先计​​算了每个数字的额外数据,但每个数字只会用于少数比较,因此昂贵的预计算(例如素数因子分解)可能不值得.
  • 偶尔的假阴性会很好,但误报不是.

我认为这在理论上可能是不可能的,但为了以防万一,将它扔到蜂巢头脑中.

biginteger rational-numbers integer-arithmetic

16
推荐指数
1
解决办法
272
查看次数

如何包含名称中包含“>”的头文件?

我承认,这是一个非常人为的问题,但这是事实。

假设您有一个>名称中包含字符的文件。这在大多数Unix系统afaik上都是可能的:

$ touch 'weird>name'
$ ls -l
-rw-r--r--  1 user  user   0 28 Mag 11:05 weird>name
Run Code Online (Sandbox Code Playgroud)

现在,假设此文件包含C / C ++代码,并且您希望将其作为标头包括在内:

#include <weird>name>

int main() {
  return weird_function();
}
Run Code Online (Sandbox Code Playgroud)

lang给我以下错误:

test.cpp:1:10: fatal error: 'weird' file not found
#include <weird>name>
Run Code Online (Sandbox Code Playgroud)

当然,由于预处理程序将指令解析到第一个指令>并查找weird文件。但是,我想知道是否存在某种转义机制来允许我包含正确的文件。

因此,在C和/或C ++中,是否可以包含>名称中包含字符的头文件?

编辑:许多建议我为什么不使用#include "weird>name"。我承认在编写问题时我的脑海里忽略了引号语法,但是它仍然有效,因为这两种语法可能会要求编译器在不同的路径中搜索(至少在理论上是这样)。那么,是否有任何转义机制让我包括weird>name使用#include <>语法?

c c++ language-lawyer c-preprocessor

15
推荐指数
2
解决办法
1288
查看次数

为什么名称的声明点在其初始值设定项之前?

Sayeth C++ 标准:

声明的点的名称是立即其完整的说明符后,其之前 初始化(如果有的话)... [basic.scope.pdecl]

也就是说,一个变量在其自身的初始化表达式的上下文中,并且可以被引用。

据我所知,你可以用它做以下类型的事情:

  1. int x = x,这是格式良好但毫无意义。
  2. void* p = &p,这很可爱但没用。
  3. std::any a {&a},#2 的 C++17 版本。
  4. MyClass m {std::move(m)}中,C ++ 11版本的#1和可能UB莫名其妙
  5. MyClass m {myFunc(m)},用一个函数来获取你未初始化的对象,我想把它记录在某个地方?并返回一些值,以便构造函数可以试一试。

#1-4当然没用。似乎可以构建一个接口,其中 #5 有意义,但我认为它不是完成任何事情的最直接方式。由于在评估初始化程序时新变量尚未初始化,因此读取其值是无用/非法的,并且其地址通常对其初始化并不重要。

(对于将声明点保留到初始化器之后,可以提出一个稍微强一点的案例:int avg = avg(a,b,c)。这不是好的代码,它对任何事情都不是必需的,但它比void* p = &p.更有意义。)

但这不仅仅是关于用例。通常,C++ 会煞费苦心地阻止访问未初始化的对象。例如,它一次设置一个对象的 vtable 一个基类:如果 D 继承自 C 继承自 B,则在 C 的构造函数期间,虚方法将被分派给 C 的实现,而不是 D 的实现。可以查看未初始化对象的常见情况是这种情况,以及(更常见的问题)this在成员初始值设定项表达式中的使用。

因此,我看不到在其初始化程序之前将名称带入范围的用途,并且我可以看到将其延迟到初始化程序之后的明确理由(Stroustrup 也会看到)。鉴于此,C++ 选择的行为是否有明确的点?

c++ language-lawyer

14
推荐指数
1
解决办法
403
查看次数

"最重要的const"有条件表达式吗?

请考虑以下代码:

int foo(MyClass const* aPtr = 0) {
    MyClass const& a = aPtr ? *aPtr : MyClass(); // Either bind to *aPtr, or to a default-constructed MyClass
    ...
    return a.bar();
}
Run Code Online (Sandbox Code Playgroud)

"最重要的常量",当然,要在这里被使用.目的是允许aPtr传入null (BTW,是的,它必须是指针参数),在这种情况下,临时MyClass对象将被默认构造,并且其生命周期由绑定到它的const引用扩展.然而,如果aPtr不是null,则引用将绑定到其指向的对象,而不会发生任何(昂贵的)复制构造.

问题二是:

  1. 如果aPtr == 0,a保证MyClass在函数结束之前引用有效对象?
  2. 如果aPtr != 0,将a绑定它,而不是其他一些MyClass

根据测试,1的答案几乎肯定是"是".#2我不太确定,但是(复制省略等)......条件表达式似乎有可能最终复制构造一个临时MyClass*aPtr,并延长那个临时的生命.

c++ conditional-operator

11
推荐指数
1
解决办法
211
查看次数

Rational Application Developer与Eclipse

Rational Application Developer中存在哪些特性或功能,而不是Eclipse中的特性或功能?为什么需要Rational Application Developer?

eclipse ibm-rad

10
推荐指数
2
解决办法
1万
查看次数