易截截图软件、单文件、免安装、纯绿色、仅160KB

不用临时变量交换两个数的值(C实现)

当要交换两个数的值时,通常的做法是定义一个临时变量,然后再进行交换。那么能不能不用临时变量而交换两个数的值呢?可以的!C语言提供的异或运算就可以实现这样的操作。
 
异或运算符^也称XOR运算符,它的规则是若参加运算的两个二进位同号,则结果为0(假);异号为1(真)。即0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0。
 
例:
#include <stdio.h>
int main(int argc, char *argv[])
{
    int a = 2, b = 6;
    a = a ^ b;
    b = b ^ a;
    a = a ^ b;
    printf("a = %d b = %d\n", a, b);
    return 0;
}
结果如下: a = 6 b = 2
分析:前两个赋值语句:“a = a ^ b;”和“b = b ^ a;”相当于b = b ^ (a ^ b),而b ^ a ^ b等于a ^ b ^ b。b ^ b的结果为0,因为同一个数与相向相^,结果必为0。因此b的值等于a ^ 0,即a,其值为2。
再执行第三个赋值语句:“a = a ^ b”。由于a的值等于(a ^ b),b的值等于(b ^ a ^ b),因此,相当于a = a ^ b ^ b ^ a ^ b,即a的值等于a ^ a ^ b ^ b ^ b,等于b。
另外两种方法:
方法一:
void swap(int *p, int *q)
{
    *p = *p + *q;
    *q = *p - *q;
    *p = *p - *q;
}
方法二:
void swap(int *p, int *q)
{
    *p = *p + *q - (*q = *p);
}
原理为算术运算符的结合顺序为自左至右。
注:可以把异或的三条语句压缩为一条:a ^= b ^= a ^= b;
要交换三个变量的值,用下面变量会报错:c = a + c - (a = b, b = c);
下面来分析一下,先看一个示例程序,如下:
#include <stdio.h>
int main(int argc, char *argv[])
{
    int a = 1;
    int b = 2;
    int c = 3;
    c = a + c - (a = b, b = c);
    printf("a = %d\n", a);
    printf("b = %d\n", b);
    printf("c = %d\n", c);
    return 0;
}
编译运行,结果如下:a = 2 b = 3 c = 2
可见,最初目标中的c = 1部分没能实现。于是分析原因:


相关文档:

使你的C/C++代码支持Unicode

本文摘自I18nGuy
主页的一篇内容,原文地址:http://www.i18nguy.com/unicode/c-unicode.zh-CN.html
这份文档简要的说明了如何修改你的C/C++代码使之支持Unicode。在这里并不准备
解释太多相关的技术细节并且我得假定你已经基本熟悉Microsoft支持Unicode的方式。
它的主要目的是方便你查询相关的数据类型和函数,以及修 ......

c文件操作,兼容多字节和unicode

在<TCHAR.h>头文件里,有这么一组操作文件的宏
       #define _tfdopen    _wfdopen
      
#define _tfsopen    _wfsopen
      
#define _tfopen     _wfope ......

C compiler cannot create executables的解决方法

搞了几天的问题。编译一个文件时,老是出下面这个错.
checking for C compiler default output file name… configure: error: C compiler cannot create executables
没法子,找高人帮我处理,哈哈….记录下来.因为64位的机器,默认对CFLAGS的这是进行了设置,所以使用下面的命令清空他就行了,这样软件就不会报 ......

C# 调用 c++ dll 的一些问题总结

1.c++的到处函数只要在函数申明的时候加个导出关键字就可以了
2.参数类型问题,
一般的c++中char * 对应 c#中的string
而c++中 char **类型的参数对应c#中 ref string 这种一般都是用来返回字符串的!
3.函数入口问题,一般会出现 "找不到入口点" 这个问题不是由你引起的,而是系统自己把名字改了,改成什么样的名字建议你用 ......
© 2009 ej38.com All Rights Reserved. 关于E健网联系我们 | 站点地图 | 赣ICP备09004571号