- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我刚刚学到了这个很棒的模式(实际上是从 javascript 学到的),我想将它应用到我的 C++ 代码中。
为了解释这个模式,假设我将一个字符串表示为这些的链表:
struct link_char;
struct link_char
{
link_char * next;
char code;
};
请注意,任何 link_char 字符串的最后一个字符的代码始终为 ==0。此属性意味着我可以检查字符串中的值,同时使用 && 短路来防止 NULL 指针访问。
bool equals_hello( const link_char * first_char )
{
const link_char * c = first_char;
return c->code=='h'
&& (c=c->next)->code=='e'
&& (c=c->next)->code=='l'
&& (c=c->next)->code=='l' // if string == "hel", we short-circuit here
&& (c=c->next)->code=='o';
}
我的问题是关于安全性,而不是可读性。我知道只要 && 没有重载,短路就会起作用。但是赋值操作会以正确的顺序发生,还是由实现定义?
上面的例子明确说明了读/写可以发生的地方,但我也想在可能有副作用的情况下使用这种模式。例如:
// think of these as a bunch of HRESULT type functions
// a return value of 0 means SUCCESS
// a return value of non-zero yields an Error Message
int err;
( !(err=initialize()) && !(err=create_window()) && !(err=run_app() )
|| handle_error(err);
这些类型的操作能否按预期跨平台工作?我读过“如果你在你也写它的表达式中读取变量两次,结果是未定义的”。但直觉上我觉得短路可以保证顺序,不是吗?
最佳答案
是的。
内置逻辑与(&&
)、逻辑或(||
)和逗号运算符(,
)是只有对于二元运算符 C++ 保证求值将计算左表达式然后(如果没有短路)右表达式的情况(逗号运算符当然总是计算两个操作数,先左后右)。
另请注意,函数参数之间的逗号不是逗号运算符,因此未指定函数参数的计算顺序,甚至更糟:例如在 f(g(h()),i ())
调用顺序可能是 h,i,g,f
。
此外,有关评估顺序的保证仅适用于内置运算符;如果您重新定义它们,那么它们基本上会变成函数调用,其中不能保证参数的计算顺序并且不执行短路。
<罢工>其他二元运算符不保证计算顺序,例如一个常见的错误是认为在:std::cout << foo() << bar();
对
foo()
的调用保证在对
bar()
的调用之前发生……这
不是 是的。
(C++17 修复了这个问题,但只在少数非常特殊的情况下,包括左移运算符,因为它用于流)
当然,
三元
:?
运算符的求值顺序也是有保证的,在第一次求值条件后,只会求值其他两个表达式中的一个。
另一个保证计算顺序(有时让新手感到惊讶)的地方是构造函数的成员初始化列表,但在这种情况下,顺序
不是表达式中的顺序,而是类中成员声明的顺序....例如:
struct Foo
{
int x, y;
Foo() : y(compute_y()), x(compute_x()) {}
};
在这种情况下,保证调用 compute_x()
将在调用 compute_y()
之前完成,因为 x
在成员声明中位于 y
之前。
关于c++ - c++ 中的逻辑 AND + 赋值,安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6544139/
你能解释一下这个作业是如何完成的吗, var fe, f = document.forms[0], h; 哪个等于哪个。 最佳答案 以上等同于 var fe; var f = document.for
据我测试,这两种方法都有效,但我不知道哪一种最好,也不知道它们之间的区别,这就是我想知道的。 以下是两种方法: window.location = 'http://www.google.com'; w
我正在处理用字符串填充的 numpy 数组。我的目标是分配给第一个数组 a 的切片,值包含在较小尺寸的第二个数组 b 中。 我想到的实现如下: import numpy as np a = np.em
在我使用过的其他语言(如 Erlang 和 Python)中,如果我正在拆分字符串并且不关心其中一个字段,我可以使用下划线占位符。我在 Perl 中试过这个: (_,$id) = split('
我认为这似乎很简单,但我对调用、应用、绑定(bind)感到困惑。等等 我有一个事件监听器 red.addEventListener("click", function() { j = 0;
这个问题在这里已经有了答案: What is the python "with" statement designed for? (11 个答案) 关闭 7 年前。 使用有什么区别: iFile =
这个问题在这里已经有了答案: What is the python "with" statement designed for? (11 个答案) 关闭 7 年前。 使用有什么区别: iFile =
几周前我们开始写一篇关于 Haskell 的论文,刚刚接到我们的第一个任务。我知道 SO 不喜欢家庭作业问题,所以我不会问怎么做。相反,如果有人能将我推向正确的方向,我将不胜感激。鉴于它可能不是一个特
我正在尝试为我的函数的变量根分配一个值,但似乎不起作用。我不明白这个问题。 hw7.c:155:7:警告:赋值使指针来自整数而不进行强制转换[默认启用] root = 负载(&fp, 大小); 此代码
我昨天花了大约 5 个小时来完成这个工作,并使用这个网站的帮助让代码可以工作,但我认为我这样做的方式是一种作弊方式,我使用了 scanf 命令。无论如何,我想以正确的方式解决这个问题。多谢你们!哦,代
我需要一些帮助来解决问题。 我有这个文本文件: 我将文本内容输入到字符串二维数组中,并将其转换为整数二维数组。当我转换为 int 数组时,nan 被替换为零。现在,我继续查找二维数组中每行的最大值和最
假设我有一个只能移动的类型。我们停止现有的默认提供的构造函数,但 Rvalue 引用引入了一种新的“ flavor ”,我们可以将其用于签名的移动版本: class CantCopyMe { priv
假设我有两个简单的对象,我想创建第三个对象来连接它们的属性。这非常有效: (()=>{ const a1 = {a: 2, b: 3} const b1 = {a: 100, c: 5}
我想知道我是否可以稍后在这样的代码中为 VAR 赋值 var myView: UIView func createView() { myView = UIView() { let _view =
我遇到了一些 Javascript/HTML/CSS 代码的问题。我对创建网站还很陌生,所以请多多包涵。 我最终想做的是从 javascript 中提取一个动态值并使用它对一些 div(在容器中)进行
#include class Box{ public: int x; Box(){ x=0; std::cout No move construction thanks to RV
我发现在javascript中&=运算符是按位赋值: var test=true; test&=true; //here test is an int variable javascript中是否存在
请帮助完成赋值重载函数的执行。 这是指令: 赋值运算符 (=),它将源字符串复制到目标字符串中。请注意,目标的大小需要调整为与源相同。 加法 (+) 和赋值 (=) 运算符都需要能够进行级联运算。这意
我有一个名为 SortedArrayList 的自定义结构它根据比较器对其元素进行排序,我想防止使用 operator[] 进行分配. 示例: 数组列表.h template class Array
我是 python 的新手,我看到了这种为列表赋值的形式 color= ['red' if v == 0 else 'green' for v in y] 但是如果我尝试用 3 个数字来做,例如 co
我是一名优秀的程序员,十分优秀!