C 'for' 루프의 다중 조건
이 암호를 우연히 발견했습니다.나는 일반적으로 a에서 여러 조건을 구분할 때 '&&' 또는 '|'를 사용합니다.for
루프, 하지만 이 코드는 쉼표를 사용합니다.
놀랍게도 제가 조건의 순서를 바꾸면 출력이 달라집니다.
#include<stdio.h>
int main() {
int i, j=2;
for(i=0; j>=0,i<=5; i++)
{
printf("%d ", i+j);
j--;
}
return 0;
}
출력 = 2 2 2 2 2 2 2
#include<stdio.h>
int main(){
int i, j=2;
for(i=0; i<=5,j>=0; i++)
{
printf("%d ", i+j);
j--;
}
return 0;
}
출력 = 2 2 2 2
누가 이유를 설명해 줄 수 있습니까?마지막 쉼표로 구분된 조건만 확인하는 것 같습니다.
쉼표 연산자는 모든 피연산자를 평가하고 마지막 피연산자의 값을 산출합니다.그래서 기본적으로 어떤 조건을 먼저 쓰든 간에 무시되고, 두 번째 조건은 중요한 것입니다.
for (i = 0; j >= 0, i <= 5; i++)
따라서 와 동치입니다.
for (i = 0; i <= 5; i++)
이것은 그의 의도에 따라 코드의 작성자가 의도한 것일 수도 있고 그렇지 않을 수도 있습니다 - 저는 이것이 생산 코드가 아니기를 바랍니다, 왜냐하면 만약 이것을 작성한 프로그래머가 조건들 사이의 AND 관계를 표현하기를 원했다면, 이것은 틀렸고 그것은&&
연산자를 대신 사용했어야 합니다.
물론 당신이 처음에 말한 것은 옳습니다. 그리고 C논리 연산자. &&
그리고.||
조건(참 또는 거짓으로 평가될 수 있는 express온)을 "연결"하기 위해 일반적으로 사용하는 것입니다. 쉼표 연산자는 논리 연산자가 아니며 다른 사용자가 설명한 대로 이 예에서 쉼표 연산자를 사용하는 것은 의미가 없습니다.예를 들어 에서 문장을 "연결"하는 데 사용할 수 있습니다. i와 함께 j를 초기화하고 업데이트하거나 쉼표 연산자를 다른 방식으로 사용할 수 있습니다.
#include <stdio.h>
int main(void) // as std wants
{
int i, j;
// init both i and j; condition, we suppose && is the "original"
// intention; update i and j
for(i=0, j=2; j>=0 && i<=5; i++, j--)
{
printf("%d ", i+j);
}
return 0;
}
쉼표 식을 마지막 식(예: 오른쪽 끝)의 값을 사용합니다.
그래서 첫번째 루프에서, 유일한 제어 표현은i<=5
; 그리고j>=0
무시됩니다.
두번째 루프에서는j>=0
루프를 제어하고,i<=5
무시됩니다.
이유가 있다면...이유가 없습니다.이 코드는 잘못된 것입니다.쉼표 표현의 첫 부분은 프로그래머들을 혼란스럽게 하는 것 외에는 아무것도 하지 않습니다.만약 진지한 프로그래머가 이 글을 썼다면, 그들은 스스로 부끄러워하고 키보드를 취소해야 합니다.
이 코드를 사용하지 마십시오. 이 코드를 분명히 쓴 사람은 언어에 대한 근본적인 오해를 가지고 있으며 신뢰할 수 없습니다.식:
j >= 0, i <= 5
는 "j >= 0"을 평가한 다음 버립니다.그런 다음 "i <= 5"를 평가하여 루프를 종료하기 위한 조건으로 사용합니다.왼쪽 피연산자에 부작용이 있을 때 쉼표 연산자를 루프 상태에서 의미 있게 사용할 수 있으며 종종 다음과 같은 것을 볼 수 있습니다.
for (i = 0, j = 0; i < 10; ++i, ++j) . . .
쉼표를 사용하여 추가 초기화 및 증분 문을 몰래 삽입합니다.그러나 표시된 코드는 그런 일을 하지 않거나 다른 의미 있는 일을 하지 않습니다.
C에는 쉼표 연산자라는 연산자가 있습니다.각 식을 순서대로 실행하고 마지막 문장의 값을 반환합니다.또한 시퀀스 포인트(sequence point)인데, 이는 각 식이 다음 식이 실행되기 전에 완전히 그리고 순서대로 실행된다는 것을 의미합니다.&&
아니면||
.
위키피디아는 쉼표 연산자가 하는 일을 다음과 같이 말합니다.
및 "C C++ (됨)"로됨),
)는 첫 번째 피연산자를 평가하고 결과를 폐기한 다음 두 번째 피연산자를 평가하고 이 값(및 유형)을 반환하는 이진 연산자입니다."
크로커 씨의 답변을 마치려면 ++나 -- 연산자를 조심해야 합니다. 그렇지 않으면 다른 연산자를 모를 수도 있습니다.루프에 영향을 줄 수 있습니다.예를 들어 나는 코스에서 이와 비슷한 코드를 보았습니다.
for(int i=0; i++*i<-1, i<3; printf(" %d", i));
결과는 $12$이 될 것입니다.따라서 첫 번째 문장은 루프에 영향을 미쳤고 다음의 결과는 많은 0입니다.
for(int i=0; i<3; printf(" %d", i));
언급URL : https://stackoverflow.com/questions/16859029/multiple-conditions-in-a-c-for-loop
'sourcecode' 카테고리의 다른 글
Xcode에서 충돌(file project.pbxproj)을 병합하는 방법은 svn을 사용합니까? (0) | 2023.10.15 |
---|---|
자바스크립트에서 "디바운스" 기능은 무엇입니까? (0) | 2023.10.15 |
로컬 JSON 파일에서 angularjs로 데이터 가져오기 (0) | 2023.10.15 |
mysql에 대한 여러 도커 컨테이너 또는 여러 데이터베이스가 있는 하나의 인스턴스 (0) | 2023.10.15 |
Oracle 열을 첫 번째 위치로 이동 (0) | 2023.10.15 |