运行以下代码:
// 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++中编写python例程来加速它,然后使用ctypes或cython来使用它.
我是c ++的新手.我正在使用Microsoft Visual C++ Express,因为它是免费的.
我计划实现一个表达式树,以及一个以后缀顺序评估它的方法.
我遇到的问题是:
class Node {
char *cargo;
Node left;
Node right;
};
Run Code Online (Sandbox Code Playgroud)
我无法宣布left或right作为Node类型.
C++ 14规定了constexpr函数中可以做什么和不可以做什么.其中一些(不asm,没有静态变量)似乎很合理.但该标准也不允许goto在constexpr功能,尽管它允许其他控制流机制.
这种区别背后的原因是什么?
我以为我们过去了" goto很难编译 ".
我有一个3D实体,表示为一组多面体凸壳的联合.(或者单个凸起,如果这样可以使事情变得更容易.)我想将该实体近似为一组球体的并集,以最小化集合中球体的数量和近似中的误差.(后一个目标是刻意模糊的:任何合理的误差度量都可以.同样,目标组合的方式在空中;要么球体的数量或误差度量可能受到限制,要么两者的某些功能可以最小化.我不想把自己指定到一个角落.)
近似值不需要完全包含原始集合或完全包含在原始集合中.每个球体可以具有任意半径.
这感觉就像NP完全的问题,并且在任何情况下都不太可能使用精确方法,所以我假设解决方案在于随机优化领域.感觉k-means的某些变体可能适合(将未覆盖的位置分配给它们最近的球体,并精炼球体以覆盖其中的一些),但我不确定如何处理多重覆盖的位置,或者如何找到局部的,不一定是覆盖 - 即使对于单个球体也是最佳的.此外,对于迭代方法,效率很重要,并且执行3D布尔操作不会有效.
mathematical-optimization approximation convex computational-geometry
关于匿名结构和联合,遵守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)
当然,它没有,我们也不希望它......如果他们像上面那样工作,那么没有理由建立匿名结构/联盟.尽管如此,该标准在这一点上似乎毫无疑问.有什么我想念的吗?
我有许多有理数的集合,每个有的分子和分母存储为一个大的(数百或数千位)无符号整数.我希望能够有效地测试a/b集合中任何给定的有理数是否等于集合中的任何其他有理数c/d.
a*d == b*c当然,最直接的方法是测试是否比计算完整产品更有效.
关于我的特定用例的一些注释:
我认为这在理论上可能是不可能的,但为了以防万一,将它扔到蜂巢头脑中.
我承认,这是一个非常人为的问题,但这是事实。
假设您有一个>名称中包含字符的文件。这在大多数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 <>语法?
Sayeth C++ 标准:
该声明的点的名称是立即其完整的说明符后,其之前 初始化(如果有的话)... [basic.scope.pdecl]
也就是说,一个变量在其自身的初始化表达式的上下文中,并且可以被引用。
据我所知,你可以用它做以下类型的事情:
int x = x,这是格式良好但毫无意义。void* p = &p,这很可爱但没用。std::any a {&a},#2 的 C++17 版本。MyClass m {std::move(m)}中,C ++ 11版本的#1和可能UB莫名其妙。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++ 选择的行为是否有明确的点?
请考虑以下代码:
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,则引用将绑定到其指向的对象,而不会发生任何(昂贵的)复制构造.
问题二是:
aPtr == 0,a保证MyClass在函数结束之前引用有效对象?aPtr != 0,将a绑定它,而不是其他一些MyClass?根据测试,1的答案几乎肯定是"是".#2我不太确定,但是(复制省略等)......条件表达式似乎有可能最终复制构造一个临时MyClass的*aPtr,并延长那个临时的生命.
Rational Application Developer中存在哪些特性或功能,而不是Eclipse中的特性或功能?为什么需要Rational Application Developer?