我有这段代码(取自这个问题):
var walk = function(dir, done) {
var results = [];
fs.readdir(dir, function(err, list) {
if (err)
return done(err);
var pending = list.length;
if (!pending)
return done(null, results);
list.forEach(function(file) {
file = path.resolve(dir, file);
fs.stat(file, function(err, stat) {
if (stat && stat.isDirectory()) {
walk(file, function(err, res) {
results = results.concat(res);
if (!--pending)
done(null, results);
});
} else {
results.push(file);
if (!--pending)
done(null, results);
}
});
});
});
};
Run Code Online (Sandbox Code Playgroud)
我正在努力遵循它,我想我理解除了接近结尾的所有内容!--pending
.在这种情况下,该命令的作用是什么?
编辑:我感谢所有进一步的评论,但这个问题已被多次回答.不管怎么说,还是要谢谢你!
++和 -
已知++(增量)和 - (减量)运算符通过鼓励过多的诡计来导致错误的代码.它们仅次于故障架构,可以实现病毒和其他安全威胁.有一个plusplus选项禁止使用这些运算符.
我知道像PHP这样的PHP结构$foo[$bar++]
可能很容易导致一个错误,但是我无法找到一个更好的方法来控制循环而不是一个while( a < 10 ) do { /* foo */ a++; }
或for (var i=0; i<10; i++) { /* foo */ }
.
jslint是否突出显示它们是因为有些类似的语言缺少" ++
"和" --
"语法或者处理方式不同,还是有其他理由可以避免我可能会丢失的" ++
"和" --
"?
以下代码打印值为9.为什么?这里return(i++)
将返回一个值11,由于--i
该值应该是10本身,任何人都可以解释这是如何工作的?
#include<stdio.h>
main()
{
int i= fun(10);
printf("%d\n",--i);
}
int fun (int i)
{
return(i++);
}
Run Code Online (Sandbox Code Playgroud) 目前我正在教授一类C++程序员C#语言的基础知识.在我们讨论主题运算符时,我使用了C#标准类别的primary,unary等运算符.
其中一位与会者感到困惑,因为在C#标准中,"postfix ++/ - "已被归入主要运营商的类别,而不是"前缀++/ - ".她的这种混乱背后的理由是,她宁愿实现C++运算符"后缀++/- " 来讲运营商"前缀++/- ".换句话说,她宁愿将运算符"prefix ++/ - "视为主要运算符. - 我理解她的观点,但我不能给她一个理由.好吧,运营商"postfix ++/ - "的优先级高于"前缀++/ - ",但这背后的唯一理由是什么?
该规范在"14.2.1运算符优先级和关联性"一节中提到了它.
所以我非常中立的问题:为什么Postfix ++/ - 在C#中被归类为主要操作符?它有更深层次的真相吗?
这样定义,我们既不做++x++
也不做++x--
.但另一方面,无论是(++x)++
和(++x)--
是有用的表达式:(++x)++
增量x
由两个并返回"中间"的价值,而(++x)--
实质上等同于x+1
而是完全避免了打电话operator+
,这是非常有用的时候.
那么为什么没有定义的优先级++x++
自动扩展到(++x)++
而不是++(x++)
?对于后者有一些隐藏的含义,我不明白,或者只是将优先级保持为一个简单的列表,所有前缀运算符组成一个单一的级别?
编辑好的,我没有明确说出来,但是:当然我的意思x
是用户定义的类型.对于内置类型,(x+=2)-1
当然比更好的(++x)++
,并且x+1
是一个很多好过(++x)--
.我想到的情况是一个相当复杂的半关联容器的迭代器,其中运算符+=
和+
(为随机访问而设计)必须重建缓存才能有效地处理一般请求,因此是一个命令比...慢++
.但是我当然可以将它们修改为总是首先检查参数是否是一个非常小的整数,并且在这种情况下只是operator++
反复调用而不是执行随机访问过程.这应该可以正常工作,虽然我可以想象我可能在某种程度上有一种情况,我想operator+=
总是采用随机访问方式,无论我呈现的数字有多少.
具有简单的和精心memorizeable优先列表,其中的优点所有之前来后缀运算符任何前缀运营商足以容忍的总是不必使用括号来构成前和后缀运算符的小缺点
++
/--
,因为该组合物是非常少用.
更简单的"C就是这样做的",虽然看起来可能是真正的原因,但对我来说远不那么令人满意,因为C中++x++
根本不允许这样做,所以可以重新定义这个非常复杂的构图而不会损坏任何构图.现有代码.
无论如何,我会继续使用(++x)--
,因为括号真的没有那么多伤害.
c++ increment operator-precedence prefix-operator postfix-operator
因为我已经重载operator++
了迭代器类
template<typename T>
typename list<T>::iterator& list<T>::iterator::operator++()
{
//stuff
}
Run Code Online (Sandbox Code Playgroud)
但是当我尝试做的时候
list<int>::iterator IT;
IT++;
Run Code Online (Sandbox Code Playgroud)
我++
使用前缀形式警告没有postifx .我怎样才能专门重载前缀/ postifx表单?
我收到了这个C表达式的警告:
*p0++ = mult(*p0, psign[i1]);
Run Code Online (Sandbox Code Playgroud)
警告是:
unsequenced modification and access to 'p0' [-Wunsequenced]
Run Code Online (Sandbox Code Playgroud)
我认为表达式应该修改为:
*p0 = mult(*p0, psign[i1]);
p0++;
Run Code Online (Sandbox Code Playgroud)
行为(修改后)是否符合预期?我认为指针增量应该在p0指向的值更新后发生.
我正在研究Java前缀运算符,并遇到了这种行为
i = +--j //does not give an error
i = -++j //does not give an error
i = ---j //gives an error
i = +++j //gives an error
Run Code Online (Sandbox Code Playgroud)
为什么会这样?
在cpprefernce.com 前缀增量的示例中,有这样的代码:
int n1 = 1;
...
int n3 = ++ ++n1;
Run Code Online (Sandbox Code Playgroud)
为什么在这种情况下链式增量不会导致UB?在这种情况下,最多一次修改的规则是否违反?
我想知道为什么以下输出7 7 6 7
而不是5 6 6 7
my $a = 5;
printf("%d %d %d %d",$a,++$a , $a++ , $a);
Run Code Online (Sandbox Code Playgroud)
我很确定它与参数编译的顺序有关
谢谢,
prefix-operator ×10
c++ ×3
c ×2
javascript ×2
c# ×1
decrement ×1
increment ×1
java ×1
jslint ×1
not-operator ×1
operators ×1
perl ×1
printf ×1
syntax ×1
syntax-error ×1