i가 값 1을 유지하는 int인 "if (i++ & & (i == 1)"가 거짓인 이유는 무엇입니까?
{
int i = 1;
if (i++ && (i == 1))
printf("Yes\n");
else
printf("No\n");
}
▁the로으▁as▁in,앞는로바▁under,▁mystanding.if
조건, 먼저 식을 입력합니다.i==1
해야 할 합니다.1
그리고 논리적으로 그리고 그것은.1
은 의가인의 입니다.i
그래서 그 표현은 되돌아와야 합니다.1 && 1 == 1
러나그나else
부품이 실행됩니다.
누군가 이유를 설명해 주시겠습니까?else
부품이 실행됩니까?
아니요. C에서, LHS의 평가 사이에 시퀀스 포인트가 있습니다.&&
연산자와 RHS의 평가, 그리고 RHS를 평가하기 전에 증가가 발생하고 완료되어야 합니다.그래서 그.i++
함).i++ != 0
)가 식이 true로 됨), 까지), )는 다음과 같습니다 따라서 RHS가 평가될 때까지,i == 2
따라서 전체 표현은 거짓이며 '아니오'가 인쇄됩니다.【】LHS의 인 경우&&
false(됨, 는 연자가 false(0)의 '.&&
교환입니다.
RHS의 : 소 의 LHS 평 RHS 가 스 포 를 갖 특 있 습 니 다 고 지 가 을 성 는 트 인 수 퀀 시 에 사 이 연 산 자 만 이 와 ▁have ▁only ▁the 다&&
,||
,그리고.,
- (으)ㄹ 수 있습니다.? :
에, 또 식 가 있는 연산자입니다.?
는뒤에나표현 뒤에 .:
평가됩니다(둘 중 하나는 항상 평가되지 않고 둘 중 하나만 평가됨).
그&&
그리고.||
연산자는 '단락' 속성을 가진 유일한 연산자입니다.의 RHS의 &&
됩니다. LHS의 는 다음과 같습니다. RHS »||
LHS가 거짓으로 평가되는 경우에만 평가됩니다.
시퀀스 포인트에 대한 설명
I don't exist I don't exist 올바르게 단언됨:
C11 표준은 시퀀스 포인트를 없애지 않았습니다. 오직 C++11 표준만이 제거했습니다.
C++11(ISO/IEC 14882:2011)은 다음을 의미합니다.
1.9 프로그램 실행
13 앞의 순서는 단일 스레드(1.10)에 의해 실행된 평가 사이의 비대칭적이고 과도적이며 쌍별 관계이며, 이는 그러한 평가들 사이에서 부분적인 순서를 유도합니다.두 가지 평가 A와 B가 주어졌을 때, A가 B보다 먼저 배열되면, A의 실행이 B의 실행보다 선행되어야 합니다.A가 A보다 먼저 시퀀스되지 않고 B가 A보다 먼저 시퀀스되지 않으면 A와 B는 시퀀스되지 않습니다.[주: 순서가 지정되지 않은 평가의 실행은 중복될 수 있습니다.—end note] A 또는 B가 A보다 먼저 시퀀스되기 전에 A 또는 B 중 하나가 시퀀스되는 경우 평가 A 및 B가 무기한 시퀀스되지만, 어떤 것이 시퀀스되는지는 지정되지 않습니다.[참고: 비결정적으로 순서가 지정된 평가는 중복될 수 없지만 둘 중 하나를 먼저 실행할 수 있습니다.—끝 노트]
C++11에서는 '시퀀스 포인트'라는 용어가 전혀 나타나지 않습니다(유일하게 근접한 일치 항목은 '시퀀스 포인터').
C11(ISO/IEC 9899:2011)은 다음을 의미합니다.
5.1.2.3 프로그램 실행
3 앞의 순서는 단일 스레드에 의해 실행되는 평가 사이의 비대칭적이고 과도적이며 쌍별적인 관계이며, 이는 그러한 평가들 사이에서 부분적인 순서를 유도합니다.두 가지 평가 A와 B가 주어졌을 때, A가 B보다 먼저 배열되면, A의 실행은 B의 실행보다 선행되어야 합니다. (반대로, A가 B보다 먼저 배열되면, B는 A보다 뒤에 배열됩니다.)A가 B 앞이나 뒤에 시퀀스되지 않으면 A와 B는 시퀀스되지 않습니다.평가 A와 B는 A가 B 앞 또는 뒤에 배열될 때 불확실하게 배열되지만,13) 어떤 것이 지정되지는 않습니다.식 A와 B의 평가 사이에 시퀀스 포인트가 존재한다는 것은 A와 관련된 모든 값 계산과 부작용이 B와 관련된 모든 값 계산과 부작용보다 먼저 시퀀스 포인트와 관련된 것임을 의미합니다. (시퀀스 포인트의 요약은 부속서 C에 제시되어 있습니다.)
13) 순서가 지정되지 않은 평가의 실행은 인터리브될 수 있습니다.순서가 결정되지 않은 평가는 인터리빙할 수 없지만 임의의 순서로 실행할 수 있습니다.
따라서 C11은 시퀀스 포인트를 유지하지만 C++11과 기본적으로 동일한 용어를 사용하여 '시퀀스 비포' 및 관련 용어를 추가합니다.
여기, 간단한 설명이 있습니다.
그리고 그것이 이 조건이 '거짓'이 되는 이유입니다.
때&&
는 식에서 사용되며, 해당 인수는 왼쪽에서 오른쪽으로 평가됩니다.그렇게i
의 가치를 가질 것입니다.2
때에(i==1)
때문에요, 그렇기 때문에 거짓 표현이고요, 그로거고, 리고그이, 짓표러.else
부품이 실행됩니다.
그러나 왼쪽 인수가 false 또는 0으로 평가되면 오른쪽 인수는 전혀 평가되지 않습니다.
저는 1&1=1과 1&0=0이 분명하다고 생각합니다.Michael L의 답변은 저에게 좋은 것 같습니다.그래도 조금 더 자세히 설명해 보겠습니다.연산자 우선 순위 목록을 제공하는 링크는 다음과 같습니다.
http://www.difranco.net/compsci/C_Operator_Precedence_Table.htm
이 링크를 방문하여 해당 표를 참조하면 &&가 왼쪽에서 오른쪽으로 연결되어 있음을 알 수 있습니다.그래서 먼저 왼쪽 부분 다음에 2가 될 것입니다(Sruit는 다이어그램을 사용하여 이를 보여주려 했습니다). 그 다음 오른쪽 부분 i==1 확인이 완료됩니다.아래와 같은 코드를 작성하면 이를 확인할 수 있습니다.
이 코드는 실행 흐름이 i==1 부분에 도달할 때 i=2를 설명합니다.
#include <stdio.h>
int main() {
int i = 1;
if (i++ && (printf("%d\n",i)))
printf("Yes\n");
else
printf("No\n");
return 0;
}
따라서 출력은 다음과 같습니다.
2
네.
그래서 2==1은 거짓으로 드러나고 결국 그 답은 놀라운 느낌을 줍니다!!!오른쪽 브래킷은 0이고 왼쪽 브래킷은 1이므로 1&0=0입니다.저는 이것이 이해하기에 충분히 공평하다고 생각합니다.
루프 문에서 i++이 포스트 인크리먼트(예: 포스트 인크리먼트)에 사용되기 때문에 혼란스럽습니다.
for (i=0;i<1;i++)
위의 루프 프로그램에서,i
먼저 초기 값을 가져오고 상태를 확인합니다.그if
조건이 참이므로 루프 본문에 대해 i를 증가시키고 i를 이전 값으로 평가하지만 루프 본문 외부에는 새 값 1이 있습니다.
사용 중인 질문에서if
그리고 오래된 가치의 범위.i
논리적 연산자가 발견되면 종료되며 자동으로 새 값을 얻고 2로 증가하므로 조건이 false를 반환합니다.
언급URL : https://stackoverflow.com/questions/31364078/why-is-if-i-i-1-false-where-i-is-an-int-holding-the-value-1
'programing' 카테고리의 다른 글
Spring Boot - Font Awesome OTS 구문 분석 오류: 변환하지 못했습니다. (0) | 2023.06.26 |
---|---|
숫자 인덱스를 기준으로 data.table의 여러 열 선택 (0) | 2023.06.26 |
IIS URL 다시 쓰기 및 Web.config (0) | 2023.06.26 |
Springfox @RestController 명명 (0) | 2023.06.26 |
SQL Server를 방해하는 요소를 확인하려면 어떻게 해야 합니까? (0) | 2023.06.26 |