다음 코드에서 컴파일러가 작동하는 방법에 대한 질문이 있습니다.
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
나는 결과가 왜 확실하지 않다 d = 11
.
다음 코드에서 컴파일러가 작동하는 방법에 대한 질문이 있습니다.
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d = (b == c++) ? (c+1) : (c-1);
printf("d = %i\n", d);
}
나는 결과가 왜 확실하지 않다 d = 11
.
답변:
C 표준 (6.5.15 조건부 연산자)에 따름
4 첫 번째 피연산자가 평가됩니다. 평가와 두 번째 또는 세 번째 피연산자 (둘 중 평가되는 것)의 평가 사이에 시퀀스 지점이 있습니다. 두 번째 피연산자는 첫 번째 피연산자가 0과 같지 않은 경우에만 평가됩니다. 세 번째 피연산자는 첫 번째 피연산자가 0과 동일한 경우에만 평가됩니다. 결과는 두 번째 또는 세 번째 피연산자 (둘 중 평가되는 것)의 값이며 아래에 설명 된 유형으로 변환됩니다 .110)
따라서이 선언의 표현을 초기화 할 때
int d = (b == c++) ? (c+1) : (c-1);
변수는 b
변수의 값과 비교 c
후 증가 연산자 그것을 증가 전에 피연산자의 값을 반환하기 때문이다.
값이 서로 같지 않기 때문에 ( b
12 c
로 설정되고 11로 설정 됨) 하위 표현식 (c-1)
이 평가됩니다.
인용문에 따르면 연산자의 상태를 평가 한 후 시퀀스 포인트가 있습니다. 이는 증분 후 연산자를 변수에 적용한 후 조건 평가 후 c
값 12
을 가짐을 의미 합니다 c
. 결과적으로 변수 d는 값 1
( 12 - 1
)으로 초기화됩니다 .
?:
. 일반적으로 C에서는 ++
동일한 피연산자에서 다른 연산과 결합 하는 것이 정의되지 않은 동작입니다. 그리고이 코드 ?:
는 다양한 특수 눈송이 규칙이 있기 때문에 예측 가능하게 작동합니다 .
조건이 거짓 Beacuse, 그러므로 false
경우이 발생합니다 c-1
,하지만 당신은 증가 이후 c
로 조건에 c++
따라서 c
지금이다 12
. 따라서 결과는 12-1이며 11입니다.
편집 : OP로 오해 된 것은 포스트 증가입니다.
실제로 실제로 일어나는 일은 다음과 같습니다.
#include<stdio.h>
int main(void)
{
int b=12, c=11;
int d;
if (b == c) { // 12 == 11 ? -> false
c = c + 1;
d = c + 1;
} else { // this executes since condition is false
c = c + 1; // post increment -> c++ -> c = 12 now
d = c - 1; // 12 - 1 = 11 -> d = 11
}
printf("d = %i\n", d);
}
c++
조건에 따라 작업 순서를 참조한다고 생각합니다 . 조건이 false이지만 증가 된 버전이 아닌의 원래 값이 c
계산에 사용됩니다 c - 1
.
c++
하고++c
c++
는 증분 후 연산자입니다. 의 값 c++
은 11이며 제작의 부작용이 c == 12
있습니다. ++c
(12)의 값 것이다
통사론
질환 ? value_if_true : value_if_false
그래서 당신은 썼습니다
int d = (b == c++) ? (c+1) : (c-1);
이 경우 결과가 11이되면 'c'값이 증가하고 (c + 1 = 12) 그 후에 만 'd'값을 c (12) -1 (11)로 설정하기 때문에 결과는 11이됩니다.
예를 들어 사용한 경우 :
int d = (b == ++c) ? (c+1) : (c-1);
명령문을 확인하기 전에 "c"값이 증가하므로 true이고 "d"값은 c (12) +1 (13)입니다.