C++深度解析 布尔类型bool 和 引用&(3)
在C++中,bool类型只有true(非0)和false(0)两个值,且bool类型只占用了一个字节。
true:非0,编译器内部用1来表示。
false:0 ,编译器内部用0表示。
#include
int main(int argc, char *argv[])
{
bool b = 0; //合法,兼容c语言特性,0代表false
printf("b = %d\n", b);
//bool类型支持数学运算
b++;
printf("b = %d\n", b);
b = b - 3;
printf("b = %d\n", b);
return 0;
}
结果如下:
分析:在C++中,遇到布尔类型bool时,将bool类型当成一个只占用1个字节的整形数。
#include
int main(int argc, char *argv[])
{
bool b = false; //0
int a = b;
printf("sizeof(b) = %d\n", sizeof(b)); //1
printf("b = %d, a = %d\n", b, a); //0, 0
b = 3;
a = b;
printf("b = %d, a = %d\n", b, a); //1, 1
b = -5;
a = b;
printf("b = %d, a = %d\n", b, a); //1, 1
a = 10;
b = a;
printf("a = %d, b = %d\n", a, b); //10, 1
a = 0;
b = a;
printf("a = %d, b = %d\n", a, b); //0, 0
return 0;
}
结果如下:
三目运算符即可作为右值使用,又可作为左值使用。
#include
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
(a < b ? a : b) = 3; // a = 3;
printf("a = %d, b = %d\n", a, b);
return 0;
}
结果如下:
#include
int main(int argc, char *argv[])
{
int a = 1;
int b = 2;
(a < b ? a : 2) = 3;
printf("a = %d, b = %d\n", a, b);
return 0;
}
结果如下:
三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用。
意义:如果三目运算符的返回都是变量的时候,返回的是变量的本身。
变量名的本质是存储空间的别名。
引用:已定义变量的别名
引用的语法:Type& name = var;
引用在定义时,必须初始化,且类型必须一致,初始化的值必须是变量,而非常量。
int a = 4;
int& b = a; //b为a的别名
b = 5; //操作b就是操作a,本质是将5赋值给a,a=5
注意:普通引用在定义时必须用相同类型的变量进行初始化。
#include
int main(int argc, char *argv[])
{
int a = 4;
int& b = a;
b = 5;
printf("a = %d\n", a);
printf("b = %d\n", b);
//相同的地址,意味着a和b标识符代表内存同一段连续的空间
printf("&a = %p\n", &a);
printf("&b = %p\n", &b);
return 0;
}
结果如下:
在C++,完全可以对同一段连续的内存,起任意多的别名。
#include
int main(int argc, char *argv[])
{
int a = 4;
float& b = a;
b = 5;
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("&a = %p\n", &a);
printf("&b = %p\n", &b);
return 0;
}
结果如下:
因为C++是强类型的语言。引用b的类型 必须和 变量a要一样。
当三目运算符的可能返回都是变量时,返回的是变量引用
当三目运算符的可能返回中有常量时,返回的是值
int a = 1;
int b = 2;
(a < b ? a : b) = 3; //正确,返回a或b的引用,可作为左值
(a < b ? 1 : b) = 4; //错误,返回1或b的值,不能作为左值
bool类型是C++新增加的基础类型
bool类型的值只能是true(非0)和false(0)
C++中的三目运算符可作为左值使用
C++中的引用可以看作变量的别名来使用
三目运算符的可能返回都是变量时,返回的是引用