C언어 변수 a<->b 방법 관련 문의 입니다.

silveracy의 이미지

두값을 변경 하는것은 제가 기본적으로 알고 있는것은

int a=1,b=2,c
c=a;
a=b;
b=c;
이런 방법입니다.

변수 a=1, b=2 이런식으로 있으면 이것을 다른 변수(ex = c)를 만들 지 않고
2가지를 이용하여 변수의 값을 서로 변경이 가능한 지 알고 싶습니다.

어려운 문제 일까요???

혹시 쉽게 변경 할 수 있는 방법이 있으시면;; 부탁드리겠습니다.

fox9의 이미지

1. b ^= a; a ^= b; b ^= a;
2. b = a - b; a -= b; b += a;
3. b가 0이 아닐경우
b = a / b; a /= b; b *= a;

silveracy의 이미지

역시.. 우물안의 개구리라; 조금만 더 넓게 보면, 다양한 방법이 있는데, 그것을 찾지 못한것 같습니다.
아직 어린데도 불구하고 머리는 굳어 있는것 같습니다.
답변 정말 감사합니다...

kslee80의 이미지

a == b 인 경우
a 나 b 중에 하나가 0 인 경우
a 나 b 중에 하나가 음수이고 다른 수가 양수인 경우
a 나 b 가 int 타입이 아닌 float 나 double 인 경우

유효한 방법인지 고민해 보시기를...

라스코니의 이미지

분명하고(아무리 나중에 다시 본다고 하더라도) 포터블(portable)한 코드가 좋은 코드입니다.
값을 서로 바꾸는 코드도 여러 가지 방법이 있지만 가장 간단한 방법이 역시 제일 좋습니다.

어떤 코드가 굉장히 많이 불릴 일이 없다면 가장 이해하기 쉽고, 버그를 쉽게 찾아 낼수 있는 코드가 더 좋은 거죠.

jick의 이미지

그냥 재미로 알아두면 좋지만 실제 코드에서는 안 쓰는 게 좋습니다. a와 b 변수 사이에 data dependency가 걸려 버리기 때문에 컴파일러가 최적화하기도 힘들고 CPU도 삽질하게 됩니다.

vacancy의 이미지


일반적인 swap인 다음 코드에서도

t = a;
a = b;
b = t;

a와 b 사이에는 data dependency가 생깁니다.

netionics의 이미지

a = a + b;
b = a - b;
a = a - b;

:)

프리노다의 이미지

이 방법도 괜찮네요 ^ㅡ^ㅋㅋ

----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------

----------------------------------------------------------
내가 아이에게 말했던 것은 무엇인가..
그것은 성공이라는 결과가 아닌..
치열함이 묻어나는 과정이었지..
그리고 앞으로의 전진..
무엇을 배워나가며 앞으로 걸어갈 것인가..
일어서자..
일어나야돼.... [록키발보아 중에서]
----------------------------------------------------------

죠커의 이미지

이식성과 의존성, 최적화를 고려하며, 일반적인 swap 함수만한 답을 찾는 것은 어렵습니다.

- 죠커's blog / HanIRC:#CN

drinkme의 이미지

진지하게 듣지 마시고...

어셈블리코드로 하면 1개로 될까요?
x86 machine이고, 상황이 아름답다면,

asm XCHG a, b

맞나??

kaeri17의 이미지

보통 쓰는 swap함수는 대부분의 경우 t라는 임시변수를 스택에 만들어서 사용하지 않고 레지스터만 이용하게 최적화 됩니다. 따라서 실제로 해 보면 XOR이나 덧셈과 뺄셈을 이용하는 swap보다 빠르다고 알고 있네요

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.