p*****2 发帖数: 21240 | 1 C++, Java都追随C的for循环。可是python, ruby, scala都给阉割了。到底为什么会这
样? |
A*******t 发帖数: 443 | 2 我个人的理解是for(int i = 0; i < something; i++)这种for循环的坏处是
1. 需要程序员弄明白index算对了没有,
2. compiler每一个循环都要check有没有out of bound(只对java而言)
而for (someElement in elementList) 这种for循环
其一,让程序员不用再人肉保证index是对的
其次,java compiler知道index不可能越界,于是可以省一点做index boundry check
的overhead吧。
还希望大牛来做进一步的指导
【在 p*****2 的大作中提到】 : C++, Java都追随C的for循环。可是python, ruby, scala都给阉割了。到底为什么会这 : 样?
|
p*****2 发帖数: 21240 | 3
check
我感觉你说的这两个例子,后者的优势更在immutability上。不知道对不对。
【在 A*******t 的大作中提到】 : 我个人的理解是for(int i = 0; i < something; i++)这种for循环的坏处是 : 1. 需要程序员弄明白index算对了没有, : 2. compiler每一个循环都要check有没有out of bound(只对java而言) : 而for (someElement in elementList) 这种for循环 : 其一,让程序员不用再人肉保证index是对的 : 其次,java compiler知道index不可能越界,于是可以省一点做index boundry check : 的overhead吧。 : 还希望大牛来做进一步的指导
|
A*******t 发帖数: 443 | 4 抛砖引玉,等大牛的指导
【在 p*****2 的大作中提到】 : : check : 我感觉你说的这两个例子,后者的优势更在immutability上。不知道对不对。
|
E*****m 发帖数: 25615 | 5
check
這個說得好。
【在 A*******t 的大作中提到】 : 我个人的理解是for(int i = 0; i < something; i++)这种for循环的坏处是 : 1. 需要程序员弄明白index算对了没有, : 2. compiler每一个循环都要check有没有out of bound(只对java而言) : 而for (someElement in elementList) 这种for循环 : 其一,让程序员不用再人肉保证index是对的 : 其次,java compiler知道index不可能越界,于是可以省一点做index boundry check : 的overhead吧。 : 还希望大牛来做进一步的指导
|
r*********r 发帖数: 3195 | 6 the for-each loop in python is used exclusively for iteration.
the for loop in C is more generic (which means there are
more ways to use/misuse it), and not expressive enough if the
container you are iterating through is not an array. |
d******r 发帖数: 5008 | 7 两种方法各有利弊。最好的办法是两种syntax都支持。
【在 E*****m 的大作中提到】 : : check : 這個說得好。
|
E*****m 发帖数: 25615 | 8
用 Lisp, 要啥有啥。
【在 d******r 的大作中提到】 : 两种方法各有利弊。最好的办法是两种syntax都支持。
|
a*w 发帖数: 4495 | 9 Java 1.5 引进了第二种。
【在 d******r 的大作中提到】 : 两种方法各有利弊。最好的办法是两种syntax都支持。
|
r*********r 发帖数: 3195 | 10 c++11 also added foreach loop. example from wikipedia:
int my_array[5] = {1, 2, 3, 4, 5};
// double the value of each element in my_array:
for (int &x : my_array) {
x *= 2;
} |
|
|
a*****i 发帖数: 268 | 11 我的理解ForEach不关心顺序所以很容易并行化。 |
d******r 发帖数: 5008 | 12 用Lisp又挣不到二十万,三十万,屁用没有。
【在 E*****m 的大作中提到】 : : 用 Lisp, 要啥有啥。
|
r*********r 发帖数: 3195 | 13 no way
【在 a*****i 的大作中提到】 : 我的理解ForEach不关心顺序所以很容易并行化。
|
m********5 发帖数: 17667 | 14 1. Reducing possible error. Bounds checking are important. It can be very
dangerous especially when one using variables outside the for-scope.
2. If there is no pointer, one cannot really for-loop through a data
structure which does not support indexing. For example link-list, which may
only have list.next(). So they need to provide iterators anyway.
For above 2 reasons, in C++ there are for_each() and for(auto& i:list){//do};
3. Indexing with boundary checking can be very expensive. Thus python/ruby
do provide lots of other special iterators which allow much better
performance than for-loop.
4. FP should not have loop anyway.
【在 p*****2 的大作中提到】 : C++, Java都追随C的for循环。可是python, ruby, scala都给阉割了。到底为什么会这 : 样?
|
l*********s 发帖数: 5409 | 15 I think in R this is somewhat true.
【在 r*********r 的大作中提到】 : no way
|
m********5 发帖数: 17667 | 16 for_each is another thing. I believe this is called range-based for
statement.
【在 r*********r 的大作中提到】 : c++11 also added foreach loop. example from wikipedia: : int my_array[5] = {1, 2, 3, 4, 5}; : // double the value of each element in my_array: : for (int &x : my_array) { : x *= 2; : }
|
p*****2 发帖数: 21240 | 17 看来boundary checking是个原因。但是while loop就没有boundary checking check吗
?这几种语言都支持C while吧? |
m********5 发帖数: 17667 | 18 Applying while-statement to serial data is bad anyway. While-loop is used in
other contexts where loop-time can not be determined.
【在 p*****2 的大作中提到】 : 看来boundary checking是个原因。但是while loop就没有boundary checking check吗 : ?这几种语言都支持C while吧?
|
r*********r 发帖数: 3195 | 19 pre c++11, for_each is just an STL function.
"for each" (without _) is a non-standard visual c++ thing, avoid it.
in c++11, the for loop is semantically enhanced,
it is the real for-each loop that you see in other languages
【在 m********5 的大作中提到】 : for_each is another thing. I believe this is called range-based for : statement.
|
s******k 发帖数: 3716 | 20 个人感觉是
for (const class& c : classes)
多线程的时候更容易优化。
check
【在 A*******t 的大作中提到】 : 我个人的理解是for(int i = 0; i < something; i++)这种for循环的坏处是 : 1. 需要程序员弄明白index算对了没有, : 2. compiler每一个循环都要check有没有out of bound(只对java而言) : 而for (someElement in elementList) 这种for循环 : 其一,让程序员不用再人肉保证index是对的 : 其次,java compiler知道index不可能越界,于是可以省一点做index boundry check : 的overhead吧。 : 还希望大牛来做进一步的指导
|
|
|
f*******n 发帖数: 12623 | 21 无论如何每一个循环都要在某个地方check有没有out of bound(在任何语言里)。
你的for (someElement in elementList) { ... },如果elementList是个array,就等于
for (int i = 0; i < elementList.length; i++) { someElement = elementList[i];
... }
如果elementList是个List,就等于
for (Iterator i = elementList.begin(); i.hasNext(); ) { someElement = i.next
(); ... }
http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jl
check
【在 A*******t 的大作中提到】 : 抛砖引玉,等大牛的指导
|
A*******t 发帖数: 443 | 22 大谢
等于
];
next
【在 f*******n 的大作中提到】 : 无论如何每一个循环都要在某个地方check有没有out of bound(在任何语言里)。 : 你的for (someElement in elementList) { ... },如果elementList是个array,就等于 : for (int i = 0; i < elementList.length; i++) { someElement = elementList[i]; : ... } : 如果elementList是个List,就等于 : for (Iterator i = elementList.begin(); i.hasNext(); ) { someElement = i.next : (); ... } : http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jl : : check
|
O*******d 发帖数: 20343 | 23 OpenMP在传统的for loop上并行使用最好。 传统的for loop有很清楚的index 分割空
间。很容易并行运行。 |
O*******d 发帖数: 20343 | 24 foreach loop的一个好处是compiler可以把循环展开unroll, 可以运行的较快。 |
s*i 发帖数: 5025 | 25 没有for loop,从list里删除一个item是什么情况?怎么写的? |
w**z 发帖数: 8232 | 26 这个靠谱。Java 后加的for(something:collection )是给iterate collection 用的。
以前用while +iterator 太丑了。
等于
];
next
【在 f*******n 的大作中提到】 : 无论如何每一个循环都要在某个地方check有没有out of bound(在任何语言里)。 : 你的for (someElement in elementList) { ... },如果elementList是个array,就等于 : for (int i = 0; i < elementList.length; i++) { someElement = elementList[i]; : ... } : 如果elementList是个List,就等于 : for (Iterator i = elementList.begin(); i.hasNext(); ) { someElement = i.next : (); ... } : http://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jl : : check
|
p**o 发帖数: 3409 | 27
这条能否展开说说?
【在 m********5 的大作中提到】 : Applying while-statement to serial data is bad anyway. While-loop is used in : other contexts where loop-time can not be determined.
|