다음 코드에서 컴파일러가 작동하는 방법에 대한 질문이 있습니다.
#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
.
답변
에서 int d = (b == c++) ? (c+1) : (c-1);
:
- 의 값은
c++
현재 값인c
11입니다. 별도로c
12가 증가합니다. b == 11
b
12 이므로 false 입니다.- 때문에
(b == c++)
거짓,(c-1)
사용됩니다. 또한c
이 시점까지 12 의 증분을 완료해야합니다. - 이후
c
12,c-1
11이다. 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
)으로 초기화됩니다 .
답변
조건이 거짓 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);
}
답변
일반적인 if 문으로 변환하면 코드는 다음과 같습니다.
int b=12, c=11;
int d;
if (b == c++)
d = c+1;
else
d = c-1;
여기서 단서 는 조건을 확인한 후 c가 증가한다는 것 입니다. 따라서 else
상태 를 입력 하지만 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)입니다.