我正在谈论前缀增量运算符,我们似乎已经遇到了分歧. 运行此代码时: var x = 0; x = ++x; 是相当于: 的第二行 x =(x = x + 1)或 x =(x + 1) 很难分辨出差异,因为结果是相同的(均为x的值为1) 我相信,当分配的左侧是变量本身时,该值不会保存到原始变量. 我的对手不同意,并认为每当使用++运算符时,值就将其保存到原始变量. 我们哪一个是对的? 解决方案 它是保存的,因此与第一个示例相似. 以此代码为例: var v = 0; v = ++v + ++v + ++v; // Returns 6 那是因为这将转化为: v = (0+1) + ((0+1)+1) + (((0+1)+1)+1); 或更准确: v = 0+1 + v = 1+1 + //Previous value of v + 1 v = 2+1 //Previous value of v + 1 为
以下是关于 prefix-operator 的编程技术问答
请考虑以下代码 #include using namespace std; class Digit { private: int m_digit; public: Digit(int ndigit=0){ m_digit=ndigit; } Digit& operator++();//prefix Digit& operator--(); //prefix Digit operator++(int); Digit operator--(int); int get() const { return m_digit;} }; Digit& Digit::operator++(){ ++m_digit; return *this; } Digit& Digit::operator--(){ --m_digit
我有一个小问题,使用前缀和后缀操作员对数字进行减法. 这是我的程序: public class postfixprefix { public static void main (String args[]) { int a = 5; int b; b = (a++) - (++a); System.out.println("B = " +b); } } 这样做,从理论上讲,我应该得到0作为答案,但是,我得到的是-2. 当我尝试单独尝试像此程序中的值一样递增值时: public class postfixprefix { public static void main (String args[]) { int a = 5; int b, c; b = a++; c = ++a; System.out.pr
我想知道为什么以下输出7 7 6 7而不是5 6 6 7 my $a = 5; printf("%d %d %d %d",$a,++$a , $a++ , $a); 我很确定它与参数汇编的顺序有关 谢谢, 解决方案 在我开始之前,让我指出,通常应该避免在表达式中设置和读取变量的情况. 首先,让我们看看操作数评估顺序.这不是许多运营商定义的,但是为列表运营商定义了这一点.记录在从左到右顺序 [1] 评估其操作数.这意味着按以下顺序评估printf的论点: "%d %d %d %d" $a ++$a $a++ $a 关键在于知道$a不会在堆栈上放置$a值的副本.它放置标量本身(以C术语为a SV*).在Perl Jargon中,我们说堆栈元素是 cliased to $a [2] .在计算理论中,您会说论点是通过参考. 传递的. ++$a也是如此,但是$a++一定会在堆栈上放置$a的副本. 这意味着我们可以查看上述printf等同于
我有这个代码(取自这个问题): 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()) {
目前,我正在教一类C ++程序员C#语言的基础知识.当我们讨论主题操作员时,我使用了C#主要,单一,单一,单位等的标准类别. 参与者之一感到困惑,因为在C#标准中," Postfix ++/- "被放在主要操作员的类别中,而不是"前缀++/- ".她在这种困惑背后的理由是,她宁愿用操作员"前缀++/- "来实施C ++操作员" Postfix ++/- " .换句话说,她宁愿将操作员"前缀++/- "视为主要操作员. - 我明白她的观点,但我不能给她一个理由.好的,操作员" Postfix ++/- "具有比"前缀++/- "更高的优点 规格在" 14.2.1操作员的优先级和关联"部分中提到了它. 所以我非常中立的问题:为什么Postfix ++/- 在C#中归类为主要操作员? 里面有更深的真相吗? 解决方案 由于ECMA标准本身并未定义"主要"操作员是什么,除了优先顺序(即"在" Unary"之前))没有其他意义.单词的选择可能很不好. 考虑到,在许多C-l
错误地,我写道: ++number++; 并得到了: Uncaught ReferenceError: Invalid left-hand side expression in prefix operation 为什么?除此以外 解决方案 在JavaScript中,++是 prefix 和 Postfix 增量操作员. postfix 运算符具有较高的优先级,因此,当我们应用优先级时,您的表达方式将变为: ++(number++); number++的结果是一个值,而不是变量引用,因此它不能是前缀增量运算符的操作数,出于相同的原因++42是无效的 - 无处可将结果写回. 当操作员的右时,为什么将其称为"左侧表达式"?您必须查看V8源代码(我可以从您在V8上执行此操作的文本(可能是Chrome)中看出).我可以推测是因为许多操作员接受了两个操作数(左右),并且他们只是将唯一的操作数称为++"左手",默认情况下.但这是猜测.
以这种方式定义,我们既不能执行++x++>>>.但另一方面,(++x)++和(++x)--都是有用的表达式:(++x)++增量x以二的速度,并返回"中间"的值,而(++x)--基本上等同于x+1,但完全相当于避免必须致电operator+,有时可能很有用. 那么,为什么未定义的优先级自动扩展到(++x)++而不是++(x++)?我不理解的后者是否有一些隐藏的含义,或者只是为了将优先级保留一个简单的列表,所有前缀运算符组成一个级别? 编辑好吧,我没有明确说出来,但是:当然,我的意思是x是用户定义的类型.对于内置类型,(x+=2)-1当然比(++x)++更好,而x+1 lot 比(++x)--好.我想到的情况是一种相当复杂的半缔合容器类型的迭代器,操作员+=和+(用于随机访问)必须重建缓存,以便有效地工作,因此比++慢.但是,当然,我可以修改它们,始终首先检查该参数是否是一个很小的整数,在这种情况下,只需重复调用operator++而不是执行随机访问过程.这应该在这里工作正常,尽
我正在写自己的阵列课程作为练习.由于,我读取非成员功能实际上比成员函数更好. ( Scott Meyers ) 我正在尝试编写尽可能多的非会员功能的运算符过载. 操作员过载 +, - 所有人都可以作为非会员功能效果. my_array operator+(const my_array & left, const my_array & right); my_array operator-(const my_array & operand); my_array & operator++(); // prefix my_array operator++(int); //postfix, compiler puts a 0 但是,作为非会员功能的前缀/后缀操作员会提供问题(如果我使用范围分辨率并使它们成为成员函数,则可以正常工作) ) 我知道并非每个操作员过载都可以是成员功能.但是,对于为什么这两个不能成为非成员的功能,我遇到了麻烦.我得到的错误是: : 'm
因为我已经对迭代器类超载operator++ template typename list::iterator& list::iterator::operator++() { //stuff } 但是当我尝试做 时 list::iterator IT; IT++; 我会警告使用前缀表格,没有任何eStifx ++.我如何才能具体超载前缀/postifx表单? 解决方案 编写同一操作员超载的版本,但给它一个类型int的参数.您不必对该参数的值做任何事情. 如果您对这种语法如何到达的历史感兴趣,这里有一个片段. 其他解决方案 一个> class Date { //... public: Date& operator++(); //prefix Date& operator--(); //prefix Date operator++(int unused)
在cpprefernce.com 示例/p> int n1 = 1; ... int n3 = ++ ++n1; 为什么在这种情况下链接的增量不会导致UB?在这种情况下,最多一次修改的规则是不违反的吗? 解决方案 在C ++ 11及更高版本中,当有两个写字或写入和一个读取的读取并访问相同的内存位置时,就会发生UB.但是++x等于x+=1,因此++ ++n1等于(n1+=1)+=1,在这里,由于分配和复合分配运算符的属性,读取和写入是严格的序列. ,然后写一个原始值,然后再次读取结果值,然后将值回编. . 在C ++ 03中,此是 ub,因为您暗示的旧规则:两种修改之间没有序列点.但是在C ++ 11中,不再有任何序列点.相反,有"在"部分顺序之前的"测序". 其他解决方案 请参阅 Brian's 答案是简单的. 这是合法的,因为C ++标准说,重点是我的... c ++ 14草稿 5.3.2增量和减少[expr.pre.incr] 前缀++
为什么这个代码在 c ++ 和 c#中的行为示例有所不同. [C ++示例] int arr[2]; int index = 0; arr[index] = ++index; 其结果将为 arr [1] = 1 ; [C#示例] int[] arr = new int[2]; int index = 0; arr[index] = ++index; 其结果将为 arr [0] = 1 ; 我觉得这很奇怪.当然,两种语言都必须有一些理由以不同的方式实施?我想知道 c ++/cli 输出将是什么? 解决方案 正如其他人所指出的那样,此代码的行为是 在c/c ++中.您可以得到任何结果. 您的C#代码的行为是严格定义由C#标准定义. 两种语言都必须有不同的实现? 肯定必须有一些理由? 好吧,假设您正在设计C#,并希望使C ++程序员的语言变得容易学习.您是否会选择将C ++的方法复制到此问题上,即使其不确定?您是否真的想让完全智
以下代码打印值为9.为什么?这里return(i++)将返回一个值11并由于--i值应该是10本身,任何人都可以解释这是怎么回事? #include main() { int i= fun(10); printf("%d\n",--i); } int fun (int i) { return(i++); } 解决方案 在++的postfix和前缀版本之间存在 big . 在前缀版本(即,++i)中,i的值递增,表达式的值是i的 new 值. 在postfix版本(即,i++)中,i的值递增,但表达式的值是i的原始值. 让我们按行分析以下代码行: int i = 10; // (1) int j = ++i; // (2) int k = i++; // (3) i设置为10(简单). 这条线上的两件事: i递增到11. i的 new 值被复制到j中.所以j现在等于11. 这条线上的两件
在GHCI中: 前奏>(+3)2 5 前奏>(*3)2 6 前奏>(/3)2 0.666666666666666 前奏>(-3)2 没有实例(num(t-> t1)) 由文字3' at :1:2 Possible fix: add an instance declaration for (Num (t -> t1)) In the expression: 3 In the expression: (- 3) 2 In the definition of it':it =( - 3)2 产生 如何纠正最后一个以使其返回-1? 解决方案 Haskell的语法不允许您像这样使用-.改用subtract函数: (subtract 3) 2 其他解决方案 作为脚注 grdddev a>,这是 haskell 98报告: 特殊表格-e表示前缀 否定,唯一的前缀操作员 haskell,是negate (e)的语法.
我得到一个警告,对于这款C前pression: * P0 = ++ MULT(* P0,psign [I1]); 该警告是: unsequenced修改和访问为“P0”[-Wunsequenced] 我觉得前pression应加以修改,以这样的: * P0 = MULT(* P0,psign [I1]); P0 ++; 时的行为(修改后)将是如预期?我认为后的值指向P0已更新指针增量应该发生。 解决方案 您在上面提供的代码片段调用未定义的行为。据C标准 C11:6.5防爆pressions: 如果一个标对象的副作用是相对无论是不同的侧面同样的标量对象或使用同一个标量对象的值的值计算,该行为是不确定的。如果有一个前pression的SUBEX pressions多个允许排序,该行为是未定义如果在任何排序中发生这样的unsequenced副作用。 84)。 在除权pression * P0 ++ = MULT(* P0,psign [I1])的修改 P0