[질문]int에 값을 누적하는 간단한문제인데도 못하고있네요,,한번만봐주세요
글쓴이: max8276 / 작성시간: 수, 2018/10/24 - 12:41오후
#include <stdio.h> int main() { int n; int sum1 = 0; int sum2 = 0; scanf("%d", &n); for (int i = 0; i < n; i++) { i & 1 ? sum1 += i : sum2 += i; } printf("%d %d", sum1, sum2); }
n까지 홀수일때 sum1에, 짝수일때 sum2에 값을 누적하는 문제입니다.
비트연산자와, for문 그리고 조건연산자를 사용하라는 조건이있어서 저렇게풀었어요
계속 '+=': 왼쪽 피연산자는 l-value이어야 합니다.
오류도 뜨고 i에 밑줄쳐지고 식이 수정할 수 있는 Ivalue여야합니다 라고뜨네요
sum1, 2 둘다 int값으로 선언돼있고, 0으로 초기화도 해서 문제가 없어보이는데 뭐가문제인거죠?
Forums:
저도 궁금해서 찾아 봤는데요 아래 링크에 이런 내용이
저도 궁금해서 찾아 봤는데요 아래 링크에 이런 내용이 있네요
https://www.thecrazyprogrammer.com/2017/08/lvalue-required-as-left-operand-of-assignment.html
정확히 왜그런지는 저도 이해를 못하겠지만
if else 문으로 바꿔야 할 듯 합니다.
근데 왜 그런지는 궁금하네요
C언어에서 3항 조건 연산자의 우선순위는 그다지
C언어에서 3항 조건 연산자의 우선순위는 그다지 직관적이지 않습니다.
확신이 없을 때는 괄호를 써서 명시적으로 나타내 주는 편이 좋습니다.
(i & 1) ? (sum1 += i) : (sum2 += i);
애초에
i & 1 ? sum1 += i : sum2 += i;
가 어떻게 parsing이 될 수 있었는지 잘 모르겠군요. 지금 syntax를 뒤적거리고 있는데 맞는 parse tree가 잘 안 나오는데요. C99 기준으로 이거 parse tree 그려 주실 수 있는 분?아하 연산자 우선순위 처리에 따른 문제인거네요
아하 연산자 우선순위 처리에 따른 문제인거네요
이렇게요?
그게...
i & 1 ? sum1 += i : (sum2 += i);
이렇게 뒤에만 괄호로 묶어줘도 제대로 해석을 하더라고요.그래서 저도 처음에는
(i & 1 ? sum1 += i : sum2) += i;
이렇게 묶이는건가 싶었는데,syntax를 찾아보니 assignment-expression는 아래와 같이 구성되어야 합니다.
unary-expression assignment-operator assignment-expression
근데 그러면 "
i & 1 ? sum1 += i : sum2
"가 unary-expression이 아니라서 parsing이 안되거든요.흠. 잘 모르겠네요.
설명하신 내용이 맞다고 생각합니다.
저도 같은 생각입니다. 먼저 답글 달아두셨지만, sum2 += i 에 소괄호를 붙여서 답글 달려고 했어요.
문법 오류이니 undefined behavior 가
문법 오류이니 undefined behavior 가 되고 컴파일러는 자기 맘대로 파싱할 수 있게 됩니다.
?: 관련 오류를 syntax error 에서 semantic error 로 대체하는 흔한 트릭입니다.
우선순위 헷갈릴 때는 확실하게 괄호를...
세벌 https://sebuls.blogspot.kr/
위 코드는 가독성이 매우 떨어지는 아주 권장되지 않는
위 코드는 가독성이 매우 떨어지는 아주 권장되지 않는 코드입니다.
아주 작은 기능을 추가하려고 하면 거의 전체를 뜯어 고쳐야 하는 코드이기도 하고요.
속편하게 나머지 연산으로 하세요. 2의 경우
속편하게 나머지 연산으로 하세요. 2의 경우 컴파일러가 최적화 해줄겁니다. 가속성이 제일 중요해요.
그리고 메인함수 리턴선언해놓고 리턴이 없네요. *nix 계열에서는 정상 종료시 반드시 0을 리턴해야합니다.
또, 조금 기교를 부려보면..
첫 질문을 잘 보셔요.
세벌 https://sebuls.blogspot.kr/
아 심심햏
댓글 달기