swap函数陷进

int32位 posted @ Oct 25, 2014 09:53:54 PM in c/cpp , 5671 阅读
转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!

使用c语言写一个函数实现两个数交换,很简单写下以下代码:

void swap(int *a, int *b)
{
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

只有三行代码,且没有引入中间变量,使用位运算,效率高!

但首先必须保证a, b 不是空指针,否则就会出现段错误。

于是代码进一步改成:

void swap(int *a, int *b)
{
    if (a == NULL || b == NULL)
        return;
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}

似乎这样就完美了?

咋一看,真没有什么问题了,不信你可以测试,无论正数,负数,还是0,基本都不会出错了。。

那么请看以下代码:

static int count = 0;
void permutation(int *a, int from, int to)
{
    if (from == to) {
        cout << ++count << ":";
        for (int i = 0; i <= to; ++i)
            cout << a[i] << " ";
        cout << endl;
        return;
    }
    for (int i = from; i <= to; ++i) {
        swap(&a[from], &a[i]);
        permutation(a, from + 1, to);
        swap(&a[from], &a[i]);
    }
}

以上代码是求一个数组全排列的递归方法,算法应该没有错?

可是输出大量0!!为什么呢???

答案在下面:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原因在于当swap(int *a, int *b)传的是同一个地址时,就会等于0

即若 a == b

*a ^= *b,此时 *a == 0, *b == 0

最后必然是 *a == 0, *b == 0,

 for (int i = from; i <= to; ++i) {
        swap(&a[from], &a[i]);
        permutation(a, from + 1, to);
        swap(&a[from], &a[i]);
    }

上面代码没有考虑当from == i的情况,即传递的是同一个地址。

所以正确的swap函数,应该是:

void swap(int* a, int* b)
{
    if (a == NULL || b == NULL || a == b)
        return;
    *a ^= *b;
    *b ^= *a;
    *a ^= *b;
}
转载请注明:http://krystism.is-programmer.com/若有错误,请多多指正,谢谢!
  • 无匹配
  • 无匹配
AP SSC Assignment Mo 说:
2022年9月09日 21:37

Department of Government Examinations and Secondary Education Board Andhra Pradesh has conducted the Assignment Exams multiple times in the academic year in Session-1 and Session-2 (Term-1 & Term-2). There are four exams are conducted Assignment-1, Assignment-2, Assignment-3 and Assignment-4. AP SSC Assignment Model Paper Every Class 10th Standard Student Studying in Government & Private Schools in Telugu Medium, English Medium & Urdu Medium can download the AP 10th Assignment Model Paper 2023 with answer solutions for theory, objective and bit questions. Subject experts of the board have designed and introduced the practice question bank for all Part-A, Part-B, Part-C, and Part-D exams.

amarnath helicopter 说:
2024年6月08日 05:58

A good blog always comes-up with new and exciting information and while reading I have feel that this blog is really have all those quality that qualify a blog to be a one.

procesul de solicit 说:
2024年6月08日 05:59

You have done a amazing job with you website

tech 说:
2024年9月07日 02:49

I appreciate your valuable insights in your fantastic post. I'm thrilled to have taken the time to read it. It's not just enough; I plan to visit your site daily. Podobnost za indijsku vizu državljani Paname

tech 说:
2024年10月24日 14:00

I'm hooked on visiting sites during my free time. I've explored many sites, but none have been as engaging as yours. Thanks for the encouragement! tourist guide to top honeymoon places in india

tech 说:
2024年12月04日 05:46

I recently started a blog, and the information you provide on your website has been really helpful and encouraging. I appreciate all of your time and effort. glowworm caves of new zealand

tech 说:
2025年1月06日 00:30

This is excellent, consider refining the flow for clarity princess party frisco texas

tech 说:
2025年1月08日 05:27

You are offering such a wonderful resource, and it is yours without charge. I adore reading blogs that recognize the importance of offering a high-quality resource without charge. Requisits de fotografia de visat indi

tech 说:
2025年2月16日 02:17

This post is another great piece of work. Where else could one find such valuable information presented in such a clear and engaging way? I think my search for such content has ended. saudi visa montenegrin citizens

tech 说:
2025年8月17日 20:03

아고다 할인코드는 웹사이트나 앱 내에서 예약 시 추가 할인을 받을 수 있는 프로모션 코드입니다. 일반적으로 아고다 자체 프로모션이나 카드사 제휴 할인 아고다 할인코드

강남여성전용마사지 说:
2025年8月26日 02:36

강남여성전용마사지 '강남 토닥이'는 전문 관리사가 제공하는 아로마·스웨디시·림프 맞춤 케어로 피로와 스트레스를 해소하는 프라이빗 여성전용 마사지 서비스입니다.

스포츠 픽 说:
2025年9月07日 06:54

스포츠 베팅이나 경기 예측에 관심이 있다면 한 번쯤 **“스포츠 픽”**이라는 용어를 들어보셨을 것입니다. 간단히 말해 스포츠 픽은 특정 경기의 결과를 미리 분석하고 예측한 정보를 의미합니다.

꽁머니 说:
2025年9月25日 23:51

즉시 환전 가능 꽁머니: 별도의 절차 없이 바로 환전할 수 있는 머니 꽁머니란 무엇일까? 꽁머니란 토토사이트에서 공짜로 무료머니 지급하는 이벤트

대구가라오케 说:
2025年12月07日 05:04

모든 연령대가 즐길 수 있는 대구의 품격 있는 노래 문화! 프라이빗 룸을 갖춘 고급 대구가라오케, 세련된 룸싸롱, 편안한 노래방까지 다양한 공간에서 최상의 서비스와

화성출장마사지 说:
2025年12月09日 10:33

화성출장마사지 - 화성 전역에 24시간 여성 전문 마사지사가 찾아가는 출장 홈타이 서비스! 아로마, 스포츠, 커플 마사지로 피로와 스트레스를 합리적 가격에 풀어

カラコン 说:
2025年12月12日 01:07

毎日清潔に使える1DAYカラコン(1日使い捨て)で、自然な色味と高い発色を両立するカラーコンタクトレンズ。目に優しい安全素材を採用し、初心者も安心

legal sex workers 说:
2025年12月16日 04:37

대전룸싸롱 술집 비지니스 클럽 룸빵 룸허브​ 문의 후 예약 방문 하시면 훨씬 쾌적하게 이용이 가능합니다. 자주 있는 회식 모임 접대 자리에서 빛이 나게 됩니다. 대전룸싸롱

구미오피 说:
2025年12月17日 00:26

구미오피에서 찾을 수 있는 다양한 마사지와 휴게텔 정보를 한자리에 모았습니다. 가격, 위치, 후기 등 핵심 정보를 친절하게 안내해 드리니 지금 확인해보세요.

대전출장마사지 说:
2025年12月18日 01:10

대전출장마사지는 호텔, 자택, 오피스 등 어디서나 받을 수 있는 방문형 전문 마사지 서비스입니다. 아로마, 스웨디시, 스포츠, 림프, 풋마사지까지 — 대전 전역 출장

대구스웨디시 说:
2025年12月19日 00:38

대구스웨디시 전문 마사지샵 – 저렴한 가격으로 최고급 스웨디시 마사지를 24시간 언제든 경험하세요. 편안한 환경과 전문 테라피스트 상주로 처음 방문도 안심입니다.

인천출장마사지 说:
2025年12月25日 06:00

저희 인천출장안마는 고객님이 가장 편안함을 느끼는 곳으로 직접 찾아가, 불필요한 이동 없이 오롯이 휴식에만 집중할 수 있도록 도와드립니다. 자택, 숙소, 오피스텔 인천출장마사지 등

乱視用カラコン 说:
2025年12月28日 02:53

乱視でもおしゃれを楽しむための乱視用カラコン徹底ガイド。選び方や注意点、最新おすすめをわかりやすく紹介します。

원주출장마사지 说:
2025年12月30日 00:03

원주출장마사지 - 원주 전역에 24시간 여성 전문 마사지사가 찾아가는 출장 홈타이 서비스! 아로마, 스포츠, 커플 마사지로 피로와 스트레스를 합리적 가격에 풀어

캔디약국 说:
2026年1月01日 00:00

캔디약국'은 성인 건강 관리에 특화된 온라인 약국으로, 주로 발기부전 치료제인 비아그라 등 의약품 처방 및 판매 서비스를 제공합니다.

유흥디자인 说:
2026年1月02日 00:00

전국 유흥업소 디자인 전문 업체! 고퀄리티 유흥이미지와 유흥프로필 제작으로 매출 상승 효과를 경험하세요. 프로필 제작 대행부터 맞춤 디자인 상담까지

부산출장마사지 说:
2026年1月04日 02:14

부산출장마사지는 '부산출장안마' 또는 '부산홈타이' 등으로도 불리며, 고객이 계신 곳으로 전문 테라피스트가 직접 찾아가 마사지를 제공하는 서비스입니다.

형사전문변호사 说:
2026年1月06日 01:58

형사전문변호사가 성범죄, 폭행, 사기, 마약 등 전국 모든 형사사건을 신속하고 전문적으로 해결합니다. 초기 수사부터 재판까지 1:1 밀착 대응, 풍부한 성공사례와

대전출장마사지 说:
2026年1月08日 00:36

대전출장마사지(대전출장홈타이) 24시 연중무휴 운영! 아로마·스포츠·발마사지 등 대전 홈타이 출장 서비스로, 대전시 전지역 남녀노소 누구나 자택이나 호텔 등

소액대출 说:
2026年1月09日 21:47

소액대출은 주로 생활비 부족 등 긴급 자금이 필요할 때 500만원 이하의 소규모 금액을 빌리는 신용대출로, 신용회복위원회의 성실상환자 지원 제도나 서민금융진흥원의 불법사금융 예방 대출

수원출장마사지 说:
2026年1月13日 01:31

수원출장마사지는 호텔, 자택, 오피스 등 어디서나 받을 수 있는 방문형 전문 마사지 서비스입니다. 아로마, 스웨디시, 스포츠, 림프, 풋마사지까지 — 수원 전역 출장

구미출장마사지 说:
2026年1月16日 22:32

김해출장마사지는 고객이 원하는 시간과 장소에 전문 테라피스트가 직접 방문하여 체계적인 마사지 프로그램을 진행하는 출장형 전문 테라피 서비스입니다. 김해출장마사지

situs toto macau 说:
2026年1月19日 04:39

Banyak orang mencari situs toto macau karena jadwal putarannya yang sering dalam sehari. Situs ini menjadi tempat bagi penggemar angka untuk melihat hasil keluaran secara langsung. Sangat penting untuk memilih platform yang memberikan data akurat dan cepat agar informasi yang didapat tidak salah. Selalu pastikan situs tersebut memiliki tampilan yang mudah digunakan oleh siapa saja.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter