C 에서, '는 어떤 차이가 ++i 를 사용하여 i++' 및 '와' 를 사용할 수 있는 '블록' 을 하는 잉크레멘테이션 루프?
i = 1. j = ++i. (i, j 는 2 2) 입니다.
i = 1. j = i++. (i, j 는 2 인 1)
루프 '를 위한' 인컨텍스트 작동합니다. 그게 더 흔하게 사용되고 ++i 것 같다 '' 때문인지 K&, R.
모든 경우에 따라 ',', '" i++ 보다 ++i 준수하십시오 " 포지셔닝하십시오' # 39, won& 진실이며당신이 문제가 발생할 수밖에 없다.
질문 효율성을 흥미롭습니다. # 39 의 시도는 here& 내 대답: https://stackoverflow.com/questions/24886/is-there-a-performance-difference-between-i-and-i > <;
, # 39 의 Freund) 에 따라 차이가 있기 때문에 'operator++ 유라유라테이코쿠 it& C++ 컴파일러 ()' 는 기능 및 객체에는 can& # 39, 임시 객체 생성 빼냅니다 최적화하려면 중간값 수용할 수 있을지 알 수 없다.
'i++' *
i++ post & # 39 는 '' 때문에 'i' 의 값을 1 씩 증분우선순위수준우선 증분을 작업 후 끝났다네.
다음 예를 볼 수 있습니다.
int i = 1, j;
j = i++;
하지만 여기서 'j' 1 '2' 의 가치를 i =. = 여기서 'i' 가치 'j' 다음 'i' 를 먼저 배정됩니다 증가합니다.
& # 39 ++i '는' 때문에 'i' 의 값을 1 씩 증분을 증분우선순위수준우선 사전 작업을 시작하기 전에. = i, j '가' i++ 실행하십시오 무슨뜻이냐믄 '후'.
다음 예를 볼 수 있습니다.
int i = 1, j;
j = ++i;
하지만 여기서 'j' 2 '2' 의 가치를 i =. = 여기서 'j' 를 '가치' 난 후 배정됩니다 잉크레멘션 'i' 의 'i'. 마찬가지로 '전 = i, j' 실행됨을 ++i ''.
for(i=0; i<5; i++)
printf("%d ",i);
및
for(i=0; i<5; ++i)
printf("%d ",i);
모두 동일한 출력을 루프를 만들 것이다. ie '0 1 2 3 4'.
여기서 중요한 것은 위해서만 사용하고 있습니다.
for(i = 0; i<5;)
printf("%d ",++i);
이 경우 출력입니다 적립율은 '1 2 3 4 5'.
i++ ':' 첫 번째 값은 이 시나리오에서의 할당되었는지 그리곤요 증분식 일이 발생한다.
'++i': 먼저 이 시나리오에서의 증분우선순위수준우선 완료되어도 그리곤요 값을 할당되었는지
다음은 시각화 및 이미지 또한 [슬라이드에서는 좋은 실용 영상] (http://www.youtube.com/watch? v = lrtcfgbUXm4) 가 동일한 보여준다.
I++ 보다 ++i 수 있는 것은 '' '약간' 에로남이네 i++ 로컬 복제본이므로 요구할 수 있다 '' 난 ',' 절대 동안 증분됩니다 가치를 심해지기 전에 ++i 않습니다. 경우에 따라서는 일부 컴파일러에도 거두어 최적화합니다 가능하면 했다. 하지만 이 모든 것이 항상 가능한 it& # 39 의 아니라 못하며창조된 컴파일러에도.
그 중 하나를 사용하여 는 유효 동일해집니다. 즉, 루프 할 일을 정확히 동일한 모두에서 인스턴스입니다.
I++ ++i 를 통한 효율성 측면에서 관련이 있을 수 있다는 것. 측면에서 언어를 사용하여 만들 수 있는 가치를 추가 복제본이므로 사양명세 게시물로의 증분식 작동자 /dev/raw/raw200 연산자에서 움직이고 있습니다. 이 관계자는 추가 작업이 될 수 있다.
그러나 앞의 두 가지 문제를 고려해야 할 수 없다.
현대 컴파일러에도 매우 크다. 이 모든 것을 볼 수 있는 것은 컴파일러에도 머리가 너무 좋은 것 같은 두 가지 방법 모두 정수 증분할 for 루프는 최적화합니다 효율적인 코드를. 실제로 사용하는 경우 프로그램에 비해 느린 것으로 인해 게시물로의 증분식 사전 증분식 실행 시간 후 컴파일러와의 사악함이라 사용하고 있습니다.
시간 복잡도 운영 면에서, 이 두 가지 방법 (해도 실제로 복제본에 수행 중인) 동일합니다. 루프 내부에 지침을 수를 작전을 수행 중인 지배하십시오 증분우선순위수준우선 작업을 할 수가 크게. 따라서 믿지아니하며 상당히 크기, 루프 성능저하 증분식 메서드입니다 적립율은 대규모 밀려 실행할 루프 바디입니다. 즉, 너는 내가 긁어줄게 오프하도록 코드만이 최적화합니다 루프의 걱정 아닌 증분식.
제 생각에는, 스타일, 결국 이 모든 문제를 단순히 아래로 기본. 그렇게 생각한다면 사전 증분식 판독값, 더 후 사용한다. 개인적으로 선호하는 게시물로의 린스먼트 요소라고 할 수 있으나, 그 전에 내가 가르쳐 준 전송되었기 때문에 내가 알고 있는 것은 아무것도 최적화합니다.
이는 전형적인 예로, 이 문제가 이렇게 심각한 문제가 발생할 수 있는 눈을 너무 일찍 최적화, 미국 디자인. 좋은 질문, 그러나 아직 없기 때문에 일반적으로 사용 또는 합의, best 에 " 조도비 practice.".
'++i' (접두어입니다 작업). * 다음 값은 증분을 color_name (예): '내가', 'int b = ++i' int = 5 이 경우, 6 할당되었는지 b 첫 그리곤요 증분을 7 및 드릴링됩니다.
'i++' (후위 작업). * 다음 가치를 증분을 color_name (예): '내가', 'int b = i++' int = 5 이 경우 5 할당되었는지 b 그리곤요 증분을 첫 6 및 드릴링됩니다.
을 넣다) 의 루프: i++ ',' 우리가 사용하는 값 때문에 일반적으로 주로 사용되는 시작 전에 "나는 '에서 루프지 증가 하지만 프로그램 논리에 따라 달라질 수 있습니다.
i++ 및 ++i # #
이 작은 차이가 좀 다른 각도에서 답을 이미 게시하기를 비해 코드를 시각화합니다 데 도움이 될 수 있습니다.
int i = 10, j = 10;
printf ("i is %i \n", i);
printf ("i++ is %i \n", i++);
printf ("i is %i \n\n", i);
printf ("j is %i \n", j);
printf ("++j is %i \n", ++j);
printf ("j is %i \n", j);
결과는.
//Remember that the values are i = 10, and j = 10
i is 10
i++ is 10 //Assigns (print out), then increments
i is 11
j is 10
++j is 11 //Increments, then assigns (print out)
j is 11
전후에 이슬람세를 신경을 쓰고 있습니다.
그 중 하나를 사용할 수 있는 경우와 작업공간에서 잉크레멘테이션 for 루프는 블록, 내 생각에 우리가 할 수 있는 최선의 결정을 내리는 것은 사용) 가 좋은 예다.
int i, j;
for (i = 0; i <= 3; i++)
printf (" > iteration #%i", i);
printf ("\n");
for (j = 0; j <= 3; ++j)
printf (" > iteration #%i", j);
결과는.
> iteration #0 > iteration #1 > iteration #2 > iteration #3
> iteration #0 > iteration #1 > iteration #2 > iteration #3
난, t, t know about you, but I don& don& # 39 # 39 의 사용은 적어도 인할지 com/go/lrvid4005_ps_kr 차이에 대한 루프지
지금 내가 solaris. 이해하겠니 차이는 시맨틱스를 (단, 왜 그랬을까 장난하는거아니고
you know, 책 또는 웹 자습서는 또는 무언가.
어쨌든 지금처럼 계속 사용할 수 있는 성능을 어느쪽이야 무시입니다 질문을합니다 심지어 c++컴파일러는 중요한 것 같지는 않습니다. 이것은 콩지름에 결정할 때 때문이다. 사용할:
무슨 뜻인지 말하도다 코드에서.
다른 버전 모두 찬성하는 (lc-fc 한 뼈 머리 스타일 가이드), 콩지름에 이 경우는 가장 정확하게 할 수 있는 형태로 너희는너희가 위해 노력하고 있다.
QED) 을 사용하여 사전 증분식 버전:
for (int i = 0; i != X; ++i) ...
이 단순한 C++ 코드에 의해 차이를 이해할 수 있다 (아래 참조).
int i, j, k, l;
i = 1; //initialize int i with 1
j = i+1; //add 1 with i and set that as the value of j. i is still 1
k = i++; //k gets the current value of i, after that i is incremented. So here i is 2, but k is 1
l = ++i; // i is incremented first and then returned. So the value of i is 3 and so does l.
cout << i << ' ' << j << ' ' << k << ' '<< l << endl;
return 0;
얼마 지나지 않아.
i++ 먹어서나 않을 경우 이들을 '는' ++i '와' 같은 함수. 같은 항목을 사용할 경우 '함수 (i++)' 또는 '함수 (++i)' 차이를 볼 수 있습니다.
'내가 먼저 함수 (++i)' 이 'i' 에 따르면, 이후에는 동일팔레트에 증분우선순위수준우선 새 값을 1 씩 작동합니다.
'기능이 있다고 (i++)' 'i' 를 통해 그 이후 첫 동일팔레트에 함수은 증분우선순위수준우선 'i' 1.
int i=4;
printf("%d\n",pow(++i,2));//it prints 25 and i is 5 now
i=4;
printf("%d",pow(i++,2));//it prints 16 i is 5 now
int j=0;
System.out.println(j); //0
System.out.println(j++); //0. post-increment. It means after this line executes j increments.
int k=0;
System.out.println(k); //0
System.out.println(++k); //1. pre increment. It means it increments first and then the line executes
int m=0;
if((m == 0 || m++ == 0) && (m++ == 1)) { //false
/* in OR condition if first line is already true then compiler doesn't check the rest. It is technique of compiler optimization */
System.out.println("post-increment "+m);
}
int n=0;
if((n == 0 || n++ == 0) && (++n == 1)) { //true
System.out.println("pre-increment "+n); //1
}
System.out.println("In Array");
int[] a = { 55, 11, 15, 20, 25 } ;
int ii, jj, kk = 1, mm;
ii = ++a[1]; // ii = 12. a[1] = a[1] + 1
System.out.println(a[1]); //12
jj = a[1]++; //12
System.out.println(a[1]); //a[1] = 13
mm = a[1];//13
System.out.printf ( "\n%d %d %d\n", ii, jj, mm ) ; //12, 12, 13
for (int val: a) {
System.out.print(" " +val); //55, 13, 15, 20, 25
}
#include <iostream>
using namespace std;
int main() {
int x=10;
int* p = &x;
std::cout<<"address = "<<p<<"\n"; //prints address of x
std::cout<<"address = "<<p<<"\n"; //prints (address of x) + sizeof(int)
std::cout<<"address = "<<&x<<"\n"; //prints address of x
std::cout<<"address = "<<++&x<<"\n"; //error. reference can't re-assign because it is fixed (immutable)
}
유일한 차이점은 운영 주문하십시오 증분우선순위수준우선 간의 변수의 값을 연산자에서 되돌려줍니다.
이 코드는 출력입니다 차이에 대해 설명하고 있다.
#include<stdio.h>
int main(int argc, char* argv[])
{
unsigned int i=0, a;
a = i++;
printf("i before: %d; value returned by i++: %d, i after: %d\n", i, a, i);
i=0;
a = ++i;
printf("i before: %d; value returned by ++i: %d, i after: %d\n", i, a, i);
}
출력은 다음과 같습니다.
i before: 1; value returned by i++: 0, i after: 1
i before: 1; value returned by ++i: 1, i after: 1
그래서 기본적으로 ',' 동시에 '후' ++i 값을 되돌려줍니다 증분됩니다 ++i 전에 값을 되돌려줍니다 올라갑니다. 결국 이 두 경우 모두 '나' 증분됩니다 그 값을 가지게 됩니다.
또 다른 예를 들어:
#include<stdio.h>
int main ()
int i=0;
int a = i++*2;
printf("i=0, i++*2=%d\n", a);
i=0;
a = ++i * 2;
printf("i=0, ++i*2=%d\n", a);
i=0;
a = (++i) * 2;
printf("i=0, (++i)*2=%d\n", a);
i=0;
a = (++i) * 2;
printf("i=0, (++i)*2=%d\n", a);
return 0;
}
출력:
i=0, i++*2=0
i=0, ++i*2=2
i=0, (++i)*2=2
i=0, (++i)*2=2
차이가 있을 때 또 다른 변수가 할당되었는지 증분우선순위수준우선 수행될 때 선택해제합니다 반환 값 또는 다른 작업과 적용되고 있는 연결 (운영체 우선 순위 ('i++2' 다르다 '++i ' 하지만 ' (i++) 2' 와 ' (++i) *2' 같은 값을 되돌려줍니다) 대부분의 경우, 교환 가능. 고전적인 비유하사 for 루프 문법:
for(int i=0; i<10; i++)
동일한 효과가 있다.
for(int i=0; i<10; ++i)
내가 만들지 않도록 채택한 종합유선방송사업자 (so) 이 둘 사이의 혼란을 규칙:
즉 것 "이라고 말했다.
++ '-' 할당에서는 전에 먼저 'i' 는 잉크레멘테이션 수행되 합니다. ++ '-' 할당에서는 후 후 'i' 는 잉크레멘테이션 수행되 합니다.