我调试一个程序已经有一段时间了,最终发现错误是由于一个引用没有像我想的那样更新。
这里有一个例子显示了我遇到的问题:
#include <iostream>
using namespace std;
struct Test {
Test& set(int& i){ i = 10; return *this; }
Test& print(const int& i){ cout << i << endl; return *this; }
};
int main(void){
int i = 0;
Test t;
t.set(i).print(i + 5);
return 0;
}
我原以为这里的print()方法会输出15,但它会输出5。
编辑:10天后,我才意识到,与叮当声输出15!这是GCC中的错误吗?
[评论太长:]
如果添加
Test& add(int& i, const int toadd)
{
i += toadd;
return *this;
}
这个电话
t.set(i).add(i, 5).print(i);
返回
15
由此我得出结论,罪魁祸首是i 5
作为打印参数。
在C语言中,不能保证单个表达式中函数参数的计算顺序,即使这些函数是链接方法调用的。你在这里调用未定义的行为,这就是你得到的。
这个运算符确实意味着排序,但仅限于运算符前面的表达式。必须在访问成员之前进行全面评估。这并不意味着子表达式的计算将暂停到该点。
另外,不要通过const int传递int
s
让我试着解释一下C 11标准。第1.9/15条规定:
除非另有说明,否则对单个运算符的操作数和单个表达式的子表达式的计算是不排序的。[...]如果对标量对象的副作用相对于对同一标量对象的另一个副作用或使用同一标量对象的值的值计算未排序,则该行为是未定义的。
当然,int
是标量类型,t.set(i)。印刷品(i 5)
对set()
中的i
和值计算i5
有副作用,因此如果没有另外说明,行为确实是未定义的。阅读§5.2.5(“类成员访问”),我找不到任何关于序列的注释
操作员。[但请参见下面的编辑!]
但是,请注意,当然可以保证在执行
print()
之前执行set()
,因为后者将前者的返回值作为(隐式this
)参数接收。这里的罪魁祸首是print
参数的值计算是
未排序的
相对于set
调用的顺序不确定。
编辑:在阅读了你(@Xeno)评论中的答案后,我重新阅读了标准中的段落,事实上后来它说:
调用函数(包括其他函数调用)中在被调用函数体执行之前或之后没有特别排序的每个求值,都是相对于被调用函数的执行不确定排序的。
因为不确定顺序不是非顺序的(“非顺序评估的执行可能重叠”,§1.9/13),这确实不是未定义的行为,而是“只是”未指定的行为,这意味着15和5都是正确的输出。
所以当
(print()参数的值计算~ set()的执行)
已成功创建nativetest.h文件 NativeTest.c代码 gcc-I/usr/java/jdk1.7.0_13/include-I/usr/java/jdk1.7.0_13/include/linux-o nativetest.so-shared nativetest.c 已成功创建共享对象文件。 当我执行nativetest时,它显示了以下错误 java-djava.library.
虽然我对Objective-C开发很熟悉,但当涉及错误解释时,我仍然认为自己有点像n00b。我在申请别人也在做的工作。我相信我们可能有不同版本的Xcode,一个开发者有一台PC(其他人和我有一台MacBook)。我使用的是Xcode 4.5.1。 问题所在 Apple clang版本4.1(Tags/Apple/Clang-421.11.66)(基于LLVM 3.1 SVN)目标:i386-App
我认为我的模板使用不当,但我不知道我做错了什么。这就像模板链表无法确定它需要使用我的术语类一样。 名单- 以下是Visual Studio 2012的确切错误: > 错误LNK1120:1未解决的外部C:\用户\迈克尔\文档\魔术公文包\尚普兰\课程工作\数据结构\pa2\调试\pa2.exe 标题。H 功能。cpp 链接列表。H 术语h
考虑以下头文件和源文件: 我在
问题内容: 我开发了一个小型Javascript / jQuery程序来访问供内部使用的pdf文件集合。我想突出显示pdf文件的信息div(如果该文件确实存在)。 有没有办法以编程方式确定到文件的链接是否损坏?如果是这样,如何? 任何指导或建议均适用。 问题答案: 但是,您不应该使用该方法,仅使用此方法,然后检查HTTP状态以获取期望值(200或小于400)。 这是一个相关问题提供的简单方法:
我正在我的网络游戏中记录断开连接。似乎75%的会话使用代码1001断开连接(正常),25%的会话使用代码1006断开连接(错误)。https://www.rfc-editor.org/rfc/rfc6455 有时出于错误原因,我会看到以下文字: CloudFlare WebSocket代理重新启动 但他说,1006次断开中的大多数根本没有给出任何理由。球员们无缘无故地断绝了联系。这通常发生在玩家积