更新,见下文!
我听说并读过C++ 0x允许编译器为以下代码段打印"Hello"
#include <iostream>
int main() {
while(1)
;
std::cout << "Hello" << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
它显然与线程和优化功能有关.在我看来,这可能让许多人感到惊讶.
有人能够很好地解释为什么必须允许这样做吗?作为参考,最新的C++ 0x草案说明了6.5/5
在for语句的情况下,在for-init语句之外的循环,
- 不调用库I/O函数,和
- 不访问或修改易失性对象,以及
- 不执行同步操作(1.10)或原子操作(第29条)
可以通过实现来假设终止.[注意:这是为了允许编译器转换,例如删除空循环,即使无法证明终止也是如此. - 结束说明]
编辑:
这篇富有洞察力的文章谈到了标准文本
不幸的是,没有使用"未定义的行为".但是,只要标准说"编译器可以假设P",就暗示具有非-P属性的程序具有未定义的语义.
这是正确的,是否允许编译器为上述程序打印"Bye"?
这里有一个更有见地的线索,这是关于C的类似改变,由Guy完成上述链接文章开始.在其他有用的事实中,他们提出了一个似乎也适用于C++ 0x的解决方案(更新:这将不再适用于n3225 - 见下文!)
endless:
goto endless;
Run Code Online (Sandbox Code Playgroud)
看来,编译器不允许优化它,因为它不是循环,而是跳转.另一个人总结了C++ 0x和C201X的建议更改
通过编写一个循环,程序员断言或者环路不可见的东西的行为(执行I/O,访问volatile对象,或执行同步或原子操作), 或者,它最终会终止.如果我通过编写一个没有副作用的无限循环来违反这个假设,我对编译器撒谎,而我的程序的行为是未定义的.(如果我很幸运,编译器可能会警告我.)语言不提供(不再提供?)表达无可见行为的无限循环的方法.
2011年3月3日更新为n3225:委员会将案文移至1.10/24并说
实现可以假定任何线程最终将执行以下操作之一:
- 终止,
- 调用库I/O函数,
- 访问或修改易失性对象,或
- 执行同步操作或原子操作.
的goto把戏,不工作了!
这是来自"Exceptional C++"的第24项,解决方案,页面底部的第一个子弹:
永远不要使用公共继承来实现"IS-ALMOST-A".我已经看到一些程序员,甚至是经验丰富的程序员,从基础公开继承并以保留基类语义的方式实现"大多数"被覆盖的虚函数.换句话说,在某些情况下,使用Derived对象作为Base将不会像合理的Base客户端所期望的那样运行.罗伯特·马丁经常引用的一个例子是从Rectangle类继承Square类通常被误导的想法"因为正方形是一个矩形".这在数学中可能是正确的,但在课堂上并不一定如此.例如,假设Rectangle类具有虚拟SetWidth(int)函数.然后广场' 设置宽度的实现也会自然地设置高度,使对象保持方形.然而,在系统的其他地方可能存在与Rectangle对象一起使用多态的代码,并且不会期望更改宽度也会改变高度.毕竟,对于一般的矩形来说,情况并非如此!这是违反LSP的公共继承的一个很好的例子,因为派生类不提供与基类相同的语义.它违反了公共继承的关键原则:"不再需要,也不能承诺." 这是违反LSP的公共继承的一个很好的例子,因为派生类不提供与基类相同的语义.它违反了公共继承的关键原则:"不再需要,也不能承诺." 这是违反LSP的公共继承的一个很好的例子,因为派生类不提供与基类相同的语义.它违反了公共继承的关键原则:"不再需要,也不能承诺."
我试过检查它,我写道:
// Square.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class Rectangle
{
private:
unsigned width_;
unsigned height_;
public:
Rectangle(const unsigned width, const unsigned height):width_(width),height_(height)
{/*Empty body*/ }
unsigned GetWidth()const
{
return width_;
}
unsigned GetHeight()const
{
return height_;
}
virtual void SetWidth(const unsigned width)
{
width_ = width;
}
void SetHeight(const unsigned height)
{
height_ = height;
}
virtual ~Rectangle()
{
cout << …Run Code Online (Sandbox Code Playgroud) 这不是一个并排的技术比较,而是关于如何"在jQuery中思考"与"在Prototype中思考".
我已经使用了Prototype很多年了,jQuery有点不那么重,直到大约一年前我开始做很多事情.
使用Prototype,我可以编写一些相当优雅的代码; 我的老板曾经审查过我的大量代码,并说这是他第一次有兴趣阅读的Javascript.我理解 - 并且从一开始就理解了 - 几乎本能地是Prototype试图做的事情,并且知道如何使用它.
我的jQuery代码更多,我怎么能把它,"workmanlike".我觉得好像我在每一步都在与jQuery作斗争.我必须(尝试)强迫自己坚持使用它而不是直接进入"原生"JS,我知道我可以更快地抨击干净的跨浏览器代码.使用它会使它更多,而不是更少,令人沮丧.
它不是(或至少不完全)缺乏对可用功能的熟悉.我经常知道我需要使用给定的函数,但它的使用方式似乎真的很奇怪.这通常表明我是以完全错误的方式来做的.
我想的越多,我就越想我以原型方式使用jQuery.
还有一些令人眼花缭乱的闪光灯还没有发生在我身上.特别是如果你和两者都做了很多工作,你发现什么是最基本的方法差异?当你从一个切换到另一个时,你如何调整你的心态?
不要害怕陈述令人眼花缭乱的明显,因为它可能只是那个致盲的闪光......
我正在阅读Andrei Alexandrescu关于D编程语言的书.他是一位优秀的作家,在解释D语言方面做得非常出色.然而,当我无法想象ASM输出或某些关键字的后果(例如输入,输出等或其他结构)时,我发现某些结构难以理解.即使我的ASM非常糟糕而且我从不使用它,但是能够理解某些关键字如何对计算机和正在进行的工作有所帮助,这对我有很大帮助.
DMD编译器有许多有趣的功能(代码覆盖,生成接口(头文件),生成文档,分析,...)但我还没有看到转换输出ASM代码.编译器会生成.obj文件,并从阅读以下链接:http://www.digitalmars.com/ctg/obj2asm.html我怀疑我需要一个工具来手动转换目标文件.我更喜欢编译器开关,有吗?
在该页面的底部,我链接到一个页面,我可以在其中支付包含该工具的产品.来自GNU背景,我非常不满意.这仅适用于C/C++,还是适用于D编译器?
有没有其他方法可以将这些.obj文件转换为可读的ASM代码,还是必须使用其他D编译器(如GDC或LDC)来获取ASM输出?我不愿意.DMD由创始人自己创建,我敢肯定他正确地实现了大部分功能/大部分优化.
那么,我该如何看一看ASM代码呢?
谢谢.
我有一个2d numpy.array,其中第一列包含datetime.datetime对象,第二列包含第二列:
A = array([[2002-03-14 19:57:38, 197],
[2002-03-17 16:31:33, 237],
[2002-03-17 16:47:18, 238],
[2002-03-17 18:29:31, 239],
[2002-03-17 20:10:11, 240],
[2002-03-18 16:18:08, 252],
[2002-03-23 23:44:38, 327],
[2002-03-24 09:52:26, 334],
[2002-03-25 16:04:21, 352],
[2002-03-25 18:53:48, 353]], dtype=object)
Run Code Online (Sandbox Code Playgroud)
我想要做的是选择特定日期的所有行,例如
A[first_column.date()==datetime.date(2002,3,17)]
array([[2002-03-17 16:31:33, 237],
[2002-03-17 16:47:18, 238],
[2002-03-17 18:29:31, 239],
[2002-03-17 20:10:11, 240]], dtype=object)
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
谢谢你的见解:)
我有一个C(不是C++)结构,就像这样
typedef struct mystruct{
float a,b;
int x, y;
} mystruct;
Run Code Online (Sandbox Code Playgroud)
然后在函数中我收集这样的数据:
mystruct List[MAX];
ListNumber = 0;
for(i = 0; i < MAX; i++)
{
if(conditions_meet)
{
List[ListNumber].a = masterlist[i].a;
Run Code Online (Sandbox Code Playgroud)
...等等
ListNumber++;
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将数组发送到一个函数
DoStuff(static int max, mystruct array[max]){
Stuff
}
Run Code Online (Sandbox Code Playgroud)
这有效,但当我尝试这样做时......
mystruct setter(int i)
{
mystruct TEMP;
TEMP.a = masterlist[i].a;
//......etc
return TEMP;
}
mystruct List[MAX];
ListNumber = 0;
for(i = 0; i < MAX; i++)
{
if(conditions_meet)
{
List[ListNumber] = setter(i);
ListNumber++;
}
}
Run Code Online (Sandbox Code Playgroud)
它会导致很多时髦的错误.为什么会这样?编辑:@ tommieb75我不能给出太多细节,结果似乎没有一个模式.该列表用作将内容绘制到屏幕的通用方法,并且具有函数而不是直接设置会在渲染中产生奇怪的问题 - …
我是linux c编程的新手,我有一个简单的程序只是为了学习,当我编译它时,它给我错误"解除指向不完整类型的指针"这里是我的代码
struct Node
{
struct Node* left;
struct Node* middle;
struct Node* right;
int nodeData;
int nodeLevel;
char isVisted;
};
struct ListNode
{
struct Node* data;
struct ListNode* next;
};
struct List
{
struct NodeList* head;
struct NodeList* tail;
int count;
};
typedef struct ListNode ListNode;
typedef struct Node Node;
typedef struct List List;
ListNode* InitListNode(Node* data)
{
ListNode* listNode=(ListNode*)calloc(1,sizeof(ListNode));
listNode->data=data;
listNode->next=NULL;
return listNode;
}
List* InitList()
{
List* list=(List*)calloc(1,sizeof(List));
list->count=0;
list->head=list->tail=NULL;
}
void EnQue(Node* data,List* que)
{
if(que->count==0) …Run Code Online (Sandbox Code Playgroud) 我有这个
A
/ \
B C
\ /
D
Run Code Online (Sandbox Code Playgroud)
A具有纯虚函数,原型如下:
virtual A* clone(void) const = 0;
Run Code Online (Sandbox Code Playgroud)
B和C几乎继承自A(class B: public virtual A,class C: public virtual A)
B具有虚函数,原型为:
virtual B* clone(void) const {};
Run Code Online (Sandbox Code Playgroud)
C具有虚函数,原型为:
virtual C* clone(void) const {};
Run Code Online (Sandbox Code Playgroud)
D继承了B&C,如:class D: public B, public C
D具有虚函数,原型为:
virtual D* clone(void) const {};
Run Code Online (Sandbox Code Playgroud)
现在,在编译时我得到以下6行错误:
error C2250: 'D' : ambiguous inheritance of 'B *A::clone(void) const'
Run Code Online (Sandbox Code Playgroud)
毫无疑问如何解决这个问题.
提前致谢.
假设我有一个伪程序的C程序:
For i=0 to 10
x++
a=2+x*5
next
Run Code Online (Sandbox Code Playgroud)
对于30 FLOPS,这个(1 [x ++] + 1 [x*5] + 1 [2+(x + 5))]*10 [循环]的FLOP数量是多少?我无法理解翻牌是什么.
请注意[...]表示我从中获取"操作"的计数.
有没有办法在python 2.6中更改Windows中的控制台字体?
我在Windows 7上.
即:
import os
os.console.font = 'Lucida Console'
Run Code Online (Sandbox Code Playgroud)
*编辑 (意外发布此答案)
更多信息和问题:
我查看了Windows API:http: //msdn.microsoft.com/en-us/library/ms682073%28v=VS.85%29.aspx
看起来它具有更改控制台字体的功能:
SetCurrentConsoleFontEx
Run Code Online (Sandbox Code Playgroud)
或者至少获取有关当前字体的信息:
GetCurrentConsoleFont
GetCurrentConsoleFontEx
Run Code Online (Sandbox Code Playgroud)
我的下一步是找到一个可以使用windows API的python模块.这是一个名为pywin32:http: //sourceforge.net/projects/pywin32/
你导入的实际模块不是pywin32,而是win32api,win32net,win32console我通过完全的猜测来解决这个问题.文档在哪里?帮助运行('win32console')
没有在那里显示所提到的字体功能,它只是简单地遗漏了它们.我在这里错过了什么吗?文档在哪里?或者哪个模块具有所有API的控制台功能......?
c++ ×3
c ×2
inheritance ×2
python ×2
architecture ×1
arrays ×1
c++11 ×1
d ×1
datetime ×1
dmd ×1
flops ×1
javascript ×1
jquery ×1
linux ×1
loops ×1
numpy ×1
optimization ×1
pointers ×1
prototypejs ×1
scipy ×1
visual-c++ ×1
windows ×1