[질문]int에 값을 누적하는 간단한문제인데도 못하고있네요,,한번만봐주세요

max8276의 이미지

#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으로 초기화도 해서 문제가 없어보이는데 뭐가문제인거죠?

익명 사용자의 이미지

저도 궁금해서 찾아 봤는데요 아래 링크에 이런 내용이 있네요

https://www.thecrazyprogrammer.com/2017/08/lvalue-required-as-left-operand-of-assignment.html

Quote:

Reason and Solution: Ternary operator produces some result, it never assign values inside operation. It is same as a function which has return type. So there should be something to be assigned but unlike inside operator.

정확히 왜그런지는 저도 이해를 못하겠지만

if else 문으로 바꿔야 할 듯 합니다.

근데 왜 그런지는 궁금하네요

익명 사용자의 이미지

C언어에서 3항 조건 연산자의 우선순위는 그다지 직관적이지 않습니다.
확신이 없을 때는 괄호를 써서 명시적으로 나타내 주는 편이 좋습니다.

(i & 1) ? (sum1 += i) : (sum2 += i);

애초에 i & 1 ? sum1 += i : sum2 += i;가 어떻게 parsing이 될 수 있었는지 잘 모르겠군요. 지금 syntax를 뒤적거리고 있는데 맞는 parse tree가 잘 안 나오는데요. C99 기준으로 이거 parse tree 그려 주실 수 있는 분?

익명 사용자의 이미지

아하 연산자 우선순위 처리에 따른 문제인거네요

jachin의 이미지

              += 
         ?                   i
 i & 1      sum1 += i
                   :
                      sum2
                                 
익명 사용자의 이미지

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이 안되거든요.

흠. 잘 모르겠네요.

jachin의 이미지

저도 같은 생각입니다. 먼저 답글 달아두셨지만, sum2 += i 에 소괄호를 붙여서 답글 달려고 했어요.

익명 사용자의 이미지

문법 오류이니 undefined behavior 가 되고 컴파일러는 자기 맘대로 파싱할 수 있게 됩니다.
?: 관련 오류를 syntax error 에서 semantic error 로 대체하는 흔한 트릭입니다.

세벌의 이미지

#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);
}
라스코니의 이미지

위 코드는 가독성이 매우 떨어지는 아주 권장되지 않는 코드입니다.
아주 작은 기능을 추가하려고 하면 거의 전체를 뜯어 고쳐야 하는 코드이기도 하고요.

twinwings의 이미지

속편하게 나머지 연산으로 하세요. 2의 경우 컴파일러가 최적화 해줄겁니다. 가속성이 제일 중요해요.

그리고 메인함수 리턴선언해놓고 리턴이 없네요. *nix 계열에서는 정상 종료시 반드시 0을 리턴해야합니다.

또, 조금 기교를 부려보면..

#include <stdio.h>
int main()
{
	int n;
	int sum[2] = { 0, 0 };
 
        int & evenSum = sum[0];
        int & oddSum = sum[1];
 
	scanf("%d", &n);
 
	for (int i = 0; i < n; i++) {
		sum[i%2] += i;
	}
 
	printf("%d %d", oddSum , evenSum );
 
       return 0;
}

세벌의 이미지

비트연산자와, for문 그리고 조건연산자를 사용하라는 조건이 있어서 저렇게 풀었어요
라고 쓴 글을 못 보셨나 봅니다.
익명 사용자의 이미지

#include <stdio.h>
#include <stdlib.h>
 
int main(){
    int n, sum_even, sum_odd;
 
    if(scanf("%d", &n) != 1 || n < 0)
        return EXIT_FAILURE;
 
    sum_even = (n >> 1) * ((n >> 1) + 1);
    sum_odd = ((n * (n+1)) >> 1) - sum_even;
    printf("%d %d\n", sum_odd, sum_even);
    return EXIT_SUCCESS;
 
    for(;;); // for문 썼음
    0&0; 0|0; 0^0; ~0; // 비트연산자 썼음
    0?0:0; // 조건연산자 썼음
}

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.