在C语言中,表达式的运算结果(返回值)是放在寄存器中的,即在C语言中返回值是一个数(值),但是,在C++语言中,返回值返回的是一个变量的本身。
如下以三目运算符为例,进行说明:
int main()
{
int a = 10;
int b = 20;
//返回一个最小数 并且给最小数赋值成3
//三目运算符是一个表达式 ,表达式不可能做左值
(a < b ? a : b )= 30;
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}
运行结果:
这就证明了在C++中返回值都是一个变量,而非一个单纯的数值,(如果返回的是数值,那么"(a < b ? a : b )= 30;"这一行,就不应该编译通过,因为对应的值怎么能被再次赋值呢?)
那么,C++编译器是如何做到的?
还是之前的例子,如果(a < b ? a : b )这个表达式可以当左值,那么起码对应的返回值得是个变量的性质吧,这个表达式要返回一个内存空间,即内存的首地址,即指针。
过程如下:当(a < b ? a : b )计算完毕后,C++编译器先不让其返回a的值,如果能返回a的地址,那么这个问题就搞定了,故整个过程被编译器处理成这个样子:(a < b ? &a : &b ),那么就自然而然的做到了返回的都是一个变量了。
本质剖析:C++编译器帮我们完成了刚才的所说的取地址的工作。
结论:
1)C语言返回变量的值 C++语言是返回变量本身。
C语言中的三目运算符返回的是变量值,不能作为左值使用。
C++中的三目运算符可直接返回变量本身,因此可以出现在程序的任何地方。
2)注意:三目运算符可能返回的值中如果有一个是常量值,则不能作为左值使用,
(a < b ? 1 : b )= 30;
3)C语言如何支持类似C++的特性呢?
====>当左值的条件:要有内存空间;C++编译器帮助程序员取了一个地址而已。
总体代码
#include <iostream>
using namespace std;
//在C语言中 表达式的结果 放在什么地方 寄存器
//1
// 在C语言中, 表达式的返回值 是变量的值
// 在C++中, 表达式返回的是变量的本身
//2 如何做到的
//让表达式返回一个内存空间 ..内存首地址 指针
//在C语言中 如何 实现 c++的效果
//3 本质
//c++编译器 帮我们程序员完成了 取地址的工作
int main()
{
int a = 10;
int b = 20;
int var = 100;
var = 101;
//返回一个最小数 并且给最小数赋值成3
//三目运算符是一个表达式 ,表达式不可能做左值
(a < b ? a : b )= 30;
//int z = (a < b ? a : b );
printf("a = %d, b = %d\n", a, b);
system("pause");
return 0;
}