[C++基础]C++很少人知道的那些细节

1.无符号int自动转换

void foo()
{
	unsigned int a = 6; 
	int b = -20; 
	(a+b > 6)?puts("> 6") : puts("<= 6"); //输出  >6
/*
这个问题测试你是否懂得 C 语言中的整数自动转换原则,
我发现有些开发者懂得极少这些东西。
不管如何,这无符号整型问题的答案是输出是“>6”。
原因是当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
因此-20变成了一个非常大的正整数,所以该表达式计算出的结果大于 6。
这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。 	
*/
}

 

2.数组共同体

union 
{ 
	int i; 
	char x[2]; 
}a; 
void fun()
{
	a.x[0] = 10; 
	a.x[1] = 2;    
	printf("%d-%d-%d\n",a.i,a.x[0],a.x[1]);
//522-10-2  :说明a.x[0]与a.x[1]互无影响,所以它们的地址是不同的。
a.i=a.x[0]+a.x[1]*256(2的8次方);
	a.i=1027;
	printf("%d-%d-%d\n",a.i,a.x[0],a.x[1]);
//1027-3-4    1027=(4)*256+(3)
	a.x[0] = 300; 
	a.x[1] = 10;    
	printf("%d-%d-%d\n",a.i,a.x[0],a.x[1]);
//2604-44-10, a.x[0]=300-256=44;a.i=a.x[0]+a.x[1]*256; 
}
/*
union这种类型,就是内部的变量共同使用一块空间,
按照size大的分配,int i 占4个字节,char x[2] 占2个,所以一共分配了4个字节。 
一共4个字节的内存,对应x来说相当于占用了低2个字节,而给x赋值的1,和10,
就存在个位和十位上了(十六进制)
 
 公用体公用一个内存区域sizeof(a)为共用体成员中长度最长的成员的size。即i
 int:             (|_|_|_|_|_|_|_|_|)(|_|_|_|_|_|_|_|_|)(|_|_|_|_|_|_|_|_|)(|_|_|_|_|_|_|_|_|)
 char x[2] :         (|_|_|_|_|_|_|_|_|)(|_|_|_|_|_|_|_|_|)
                  ^                                                                         ^
                高地址                                                                   低地址
 分析:
 a.x[0] = 10  ============================================================>(|0|0|0|0|1|0|1|0|)
 a.x[1] = 2  ==========================================>(|0|0|0|0|0|0|1|0|)
 公用体公用sizeof(int)长度即4字节32为,则赋值后共用体内存为
 a:               (|0|0|0|0|0|0|0|0|)(|0|0|0|0|0|0|0|0|)(|0|0|0|0|0|0|1|0|)(|0|0|0|0|1|0|1|0|)
 a.i 为4字节整型,则 i = 2^9 + 2^3 + 2^1 = 256 + 8 + 2 = 522
*/

3.宏定义运算

#include <iostream>
using namespace std;
#define SQR(X) X*X
int main(void)
{
	int i=10,j=5,n=10;
	n*=i+j;//n=n*(i+j)
	cout<<n<<endl;//150

	int a = 10,k = 2, m=1; 
	a /= SQR(k+m)/SQR(k+m); //a/=(k+m*k+m/k+m*k+m)
	cout<<a<<endl;//1
	return 0;
}

4.sizeof(union)

#include <iostream>
using namespace std;
union a {int a_int1;double a_double;int a_int2;};
typedef struct{a a1;char y;} b;
class c{double c_double;b b1;a a2;};
int main(void)
{
	cout<<sizeof(a)<<endl;//8
	cout<<sizeof(b)<<endl;//16
	cout<<sizeof(c)<<endl;//32
	return 0;
}

5.数组内存分配

char str1[] = “abc”;
char str2[] = “abc”;
const char str3[] = “abc”;
const char str4[] = “abc”;
const char *str5 = “abc”;
const char *str6 = “abc”;
char *str7 = “abc”;
char *str8 = “abc”;
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
结果是:0 0 1 1
解答:str1,str2,str3,str4是数组变量,它们有各自的内存空间;
而str5,str6,str7,str8是指针,它们指向相同的常量区域。

6.char <==> int

//一位整数 to  char
    char x=5+'0'; //'5'
//一位整数的char to  int
    int y='5'-'0';  //5
//获取'a'后面的'd'
    char z='a'+3;//'d'

7.自增

void testplusplus()
{
    {
        int a=4;
        a +=(a++);//==>>a=a+(a++);
        cout<<a<<endl;//9
    }
    {
        int a=4;
        a +=(++a);//==>>a = a+(++a);
        cout<<a<<endl;//10
    }
    {
        int a=4;
        //(a++) +=a;//error,“+=”左操作数必须为左值
        cout<<a<<endl;
    }
    {
        int a=4;
        (++a) +=(a++);
        //A=(++a);
        //A=A+(a++)
        cout<<a<<endl;//11
    }
    //总结:(a++),在整个表达式执行完后,才+1;
    //           (++a),在整个表达式执行前就+1;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值