x当我在左侧后增加它时,我可以在布尔表达式的两侧使用吗?
有问题的一行是:
if(x-- > 0 && array[x]) { /* … use x … */ }
Run Code Online (Sandbox Code Playgroud)
这是通过标准定义的吗?array [x]会使用新值x还是旧值?
我知道增量/减量运算符的后缀版本通常会由内置类型的编译器优化(即不会进行复制),但这是iterators 的情况吗?
他们本质上只是重载运营商,并且可以在任何数量的方式来实现,但由于他们的行为被严格定义,可以自己进行优化,如果是这样,他们是通过任何/很多编译器?
#include <vector>
void foo(std::vector<int>& v){
for (std::vector<int>::iterator i = v.begin();
i!=v.end();
i++){ //will this get optimised by the compiler?
*i += 20;
}
}
Run Code Online (Sandbox Code Playgroud) 当我在一个简单的控制台应用程序中测试后增量运算符时,我意识到我不理解完整的概念.这对我来说似乎很奇怪:
int i = 0;
bool b = i++ == i;
Console.WriteLine(b);
Run Code Online (Sandbox Code Playgroud)
输出是错误的.我曾预料到这是真的.AFAIK,在第2行,由于后增量,编译器进行比较并将i指定为true,然后i加1.但显然我错了.之后我修改了这样的代码:
int i = 0;
bool b = i == i++;
Console.WriteLine(b);
Run Code Online (Sandbox Code Playgroud)
这次输出是真的.第一个样本有什么变化?
根据这个非常高度推崇的答案,迭代一组擦除一些元素的规范方法如下:
for (it = mySet.begin(); it != mySet.end(); ) {
if (conditionToDelete(*it)) {
mySet.erase(it++);
}
else {
++it;
}
}
Run Code Online (Sandbox Code Playgroud)
当然,这是C++ 03设置擦除不返回迭代器的结果.否则一个人就可以写了it = mySet.erase(it);很明显,一个人可以写
itToDelete = it++;
mySet.erase(itToDelete);
Run Code Online (Sandbox Code Playgroud)
这个问题不是关于如何在迭代时删除元素.问题是为什么以下行显然不会导致未定义的行为.
mySet.erase(it++);
Run Code Online (Sandbox Code Playgroud)
起初我确信这必须是UB,因为我在考虑后增量方面做错了.这是一种常见(但错误的)方式,将预增量视为在评估的其余部分之前发生,并且后增量发生在AFTER之后.当然,这是错误的.后增量和前增量都有增加变量的副作用.不同之处在于这些表达式的价值.
也就是说,据我所知,C++标准(至少是C++ 03标准)没有明确说明何时会发生后增量的副作用.因此,除非我们保证如果作为后增量表达式的函数参数在进入函数体之前会产生副作用,那么这不应该是UB吗?究竟是什么(标准方面),如果有的话,禁止在迭代器在函数体内失效后发生的++副作用?
标准的行情非常受欢迎.
为了一个参数,让我们假设set的迭代器是一个内置类型,这实际上是operator ++,而不是重载的operator-function
所以,如果我执行以下代码......
int x = 0;
Debug.WriteLine(x++);
Debug.WriteLine(x += 4);
Debug.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)
......我分别得到0,5和5.我想得到的是0,1和5.在C#中有没有办法用n进行后递增?或者我必须写出+ =作为自己的陈述?
仅仅是为了上下文,我实际上正在做的是缓冲区上的一堆BitConverter操作,并且将每个操作作为一个自给自足的语句非常好,其中偏移量增加了数据类型的大小.转换成.这样,如果稍后更改缓冲区格式,我可以添加或删除一行,而不必担心任何周围的代码.
这是一个非常简单的C程序:
int main()
{
int i = 0;
while(i++ < 10)
printf("%d\n", i);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果是:
1
2
3
4
5
6
7
8
9
10
Run Code Online (Sandbox Code Playgroud)
为什么0不打印第一个数字?如果我更换了i++,++i我会得到这个:
1
2
3
4
5
6
7
8
9
Run Code Online (Sandbox Code Playgroud)
对于两者而言i++,++i第一个数字是1.
我期望0在while循环中看到for post增量while().
谢谢.
(注意:我不是在询问预增量与后增量的定义,或者它们在C/C++中的使用方式.因此,我不认为这是一个重复的问题.)
C的开发人员(Dennis Ritchie等人)出于很好的理由创建了增量和减量运算符.我不明白为什么他们决定创造前后增量/减量的区别?
我的感觉是,当C开发时,这些运算符比今天更有用.大多数C/C++程序员使用其中一种,而来自其他语言的程序员今天发现这种区别奇怪且令人困惑(注意:这完全基于轶事证据).
他们为什么决定这样做,以及计算上发生了什么变化,这种区别今天没那么有用?
为了记录,可以在C++代码中看到两者之间的差异:
int x = 3;
cout << "x = 3; x++ == " << x++ << endl;
cout << "++x == " << ++x << endl;
cout << "x-- == " << x-- << endl;
cout << "--x == " << --x << endl;
Run Code Online (Sandbox Code Playgroud)
将作为输出
x++ == 3
++x == 5
x-- == 5
--x == 3
Run Code Online (Sandbox Code Playgroud) 我有一个问题,编译器如何对以下代码进行操作:
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
Run Code Online (Sandbox Code Playgroud)
我不知道为什么结果是???d = 11.
我试图理解这个页面上的例子,让我的大脑皱起了眉头:http: //answers.yahoo.com/question/index?qid = 200991103170907AAxXYG9
更具体地说这段代码:
int j = 4;
cout << j++ << j << ++j << endl;
Run Code Online (Sandbox Code Playgroud)
给出一个输出:566
现在,如果从右到左计算表达式,这对我来说是有意义的,但是在Java中有类似的表达式:
int j = 4;
System.out.print("" + (j++) + (j) + (++j));
Run Code Online (Sandbox Code Playgroud)
给出输出:456
这更直观,因为这表明它是从左到右进行评估的.在不同的网站上研究这个问题,似乎在C++中,编译器之间的行为有所不同,但我仍然不相信我理解.Java和C++之间评估差异的解释是什么?谢谢你.
post-increment ×10
c++ ×6
c ×4
c# ×2
iterator ×2
assembly ×1
c++03 ×1
decrement ×1
increment ×1
java ×1
optimization ×1
side-effects ×1
syntax ×1
while-loop ×1