C++中^符号的意思

光用C#还不够,很多时候,还是很需要C++于是回头来看C++的资料,发现^居然没看过。

 

比如,在这里可以看到其用法:

http://msdn.microsoft.com/zh-cn/library/y52yxde8(VS.80).aspx

 

找到关于^的一点解释如下:

 

托管扩展的一个最大的问题是对指针的使用。指针被用于各种各样的任务,而其情况也是复杂多变的,因而非常难以理解。在某一特定的代码段中要解读自己在和哪一种指针打交道需要有一定程度的天赋。这种复杂性在下一个版本中会被去掉。在Visual C++ 2005中,指针还是原原本本的C++指针。它们指向稳定的对象,而您则可以用指针进行算术操作。指向对象的指针的生命周期必须由开发人员显式管理。当使用指针时,运行库不会负责对指针带来的垃圾进行清理。

 

现在让我们看一下Visual C++ 2005的设计人员是如何解决这一问题的。与Visual Studio .NET 2003和Visual Studio 2005中使用new运算符返回指针不同,gcnew运算符返回一个“句柄”这是一种新构造,在语法中用“^”符号来表示。该句柄引用托管堆中的整个对象。也就是说,它们不能用来指向类型的内部,而编译器对它们的使用有许多限制,以此来强制执行这种行为,而这也可以帮助开发人员正确并安全地使用句柄。句柄不允许进行指针算术运算,也不可以被强制转换为空指针或是任何整数类型。然而,星号和箭头运算符仍被用来取消对它的引用。

 

这并不意味着您不能再获得一个指向垃圾回收堆上的指针。与在C#中组合&运算符与固定的关键字相似,在Visual C++ 2005中,pin_ptr抽象类型允许您检索指向托管堆上对象的钉住指针。只要这个指针存在,托管堆中的对象就会被钉住,这可以防止垃圾回收器在回收的过程中移动它。Visual C++ 2005还引入了跟踪引用运算符,用百分号(%)来表示。当在C++中引入本机的&引用运算符时,大多数开发人员都知道可以把它理解成一个指向对象的指针,在使用时是由编译器来自动清除的。在大多数情况下,%对^而言就像&对*一样。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是你的第一个问题,以下是代码实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_LEN 64 char* bin_not(char* bin) { int len = strlen(bin); char* res = (char*) malloc(len + 1); for (int i = 0; i < len; i++) { res[i] = (bin[i] == '0') ? '1' : '0'; } res[len] = '\0'; return res; } char* bin_and(char* bin1, char* bin2) { int len1 = strlen(bin1), len2 = strlen(bin2); int len = (len1 > len2) ? len1 : len2; char* res = (char*) malloc(len + 1); for (int i = 0; i < len; i++) { char c1 = (i < len1) ? bin1[len1 - i - 1] : '0'; char c2 = (i < len2) ? bin2[len2 - i - 1] : '0'; res[len - i - 1] = (c1 == '1' && c2 == '1') ? '1' : '0'; } res[len] = '\0'; return res; } char* bin_or(char* bin1, char* bin2) { int len1 = strlen(bin1), len2 = strlen(bin2); int len = (len1 > len2) ? len1 : len2; char* res = (char*) malloc(len + 1); for (int i = 0; i < len; i++) { char c1 = (i < len1) ? bin1[len1 - i - 1] : '0'; char c2 = (i < len2) ? bin2[len2 - i - 1] : '0'; res[len - i - 1] = (c1 == '1' || c2 == '1') ? '1' : '0'; } res[len] = '\0'; return res; } char* bin_xor(char* bin1, char* bin2) { int len1 = strlen(bin1), len2 = strlen(bin2); int len = (len1 > len2) ? len1 : len2; char* res = (char*) malloc(len + 1); for (int i = 0; i < len; i++) { char c1 = (i < len1) ? bin1[len1 - i - 1] : '0'; char c2 = (i < len2) ? bin2[len2 - i - 1] : '0'; res[len - i - 1] = (c1 != c2) ? '1' : '0'; } res[len] = '\0'; return res; } int main(int argc, char* argv[]) { if (argc != 3) { printf("Usage: %s <binary1> <binary2>\n", argv[0]); return 1; } char* bin1 = argv[1]; char* bin2 = argv[2]; char* not_res = bin_not(bin1); char* and_res = bin_and(bin1, bin2); char* or_res = bin_or(bin1, bin2); char* xor_res = bin_xor(bin1, bin2); printf("~%s = %s\n", bin1, not_res); printf("~%s = %s\n", bin2, bin_not(bin2)); printf("%s & %s = %s\n", bin1, bin2, and_res); printf("%s | %s = %s\n", bin1, bin2, or_res); printf("%s ^ %s = %s\n", bin1, bin2, xor_res); free(not_res); free(and_res); free(or_res); free(xor_res); return 0; } ``` 这个程序通过命令行参数读取两个二进制字符串,然后分别对这两个二进制数使用~运算符、&运算符、|运算符和^运算符,并以二进制字符串形式打印结果。 例如,如果你想计算二进制数"0101"和"0011"的&运算结果,你可以在命令行输入: ``` ./program 0101 0011 ``` 然后程序将输出: ``` ~0101 = 1010 ~0011 = 1100 0101 & 0011 = 0001 0101 | 0011 = 0111 0101 ^ 0011 = 0110 ``` 希望这个程序能够帮助你。如果你有任何问题或疑问,请随时提出。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值