做互联网小程序 和网站有没有前景,阿里巴巴申请网站怎么做,个人网站的制作实验报告,软文推广渠道C/C陷阱——临时变量的产生和特性
在学习C常引用时#xff0c;有这样一段代码引起了我的注意#xff1a;
int a 1;
double b a;当我编译这段代码时#xff0c;竟然报错了#xff1a; 按理来说#xff0c;初始化引用时不能涉及权限的放大#xff08;如用const in…C/C陷阱——临时变量的产生和特性
在学习C常引用时有这样一段代码引起了我的注意
int a 1;
double b a;当我编译这段代码时竟然报错了 按理来说初始化引用时不能涉及权限的放大如用const int初始化int但是这里只是权限的平移为什么会错误呢
我们可以看到报错信息里有这样一句话非常量限定这指的又是什么呢
这就是本次要讨论的重点——临时变量的产生和特性 在C和C中临时变量通常指的是临时创建并存储数据的变量它们在表达式求值或函数调用中起到临时存储值的作用。这些临时变量通常是由编译器自动生成的无需程序员显式声明或管理。 临时变量的产生
临时变量主要在下面这两种情况下产生
类型转换 当需要将一个数据类型转换为另一个数据类型时通常会生成临时变量来保存转换后的值 例如
int a 10;
double b a;我们都知道将整型变量a赋值给双精度浮点型变量b时涉及到了隐式类型转换但我们可能大多数都忽略了这个过程中就产生了一个临时变量来存储转换后的值最后变量b接收的就是这个临时变量。因为只有这样我们才能在类型转换的过程中确保变量a的数据是完整的、合规的、安全的。
又例如
int a 1;
int* pt (int*)a;我们总不能说将整型变量a强制转换为整型指针后整型变量a就变成指针了吧。
函数调用 当一个函数返回一个值时通常会生成临时变量来存储函数的返回结果。这个临时变量可以被赋给其他变量或用于进一步的操作。 int Add(int a, int b)
{int sum a b;return sum;
}int main()
{int ret Add(1, 2);return 0;
}Add函数就是一个简单的两数相加的函数。那么小伙伴觉得这个函数的返回值是什么是变量sum吗当然不是应该清楚局部变量出了其所在函数的作用域后就会被销毁因此当Add函数被调用完后sum所代表的值就是一个随机数了。因此实际上编译器一般都会生成一个临时变量来存储函数返回的结果最后ret接受的也是这个临时变量。
除了上面两种情况外还有其他的一些情况也会有临时变量的产生大家了解即可 表达式求值当需要计算一个表达式特别是包含多个操作数和操作符的复杂表达式时编程语言通常会生成临时变量来保存中间结果。中间计算在执行复杂计算时可以使用临时变量来存储中间计算结果以避免重复计算相同的值。循环迭代在循环结构中迭代计数器通常被视为临时变量因为它们在每次迭代中都会被更新。条件语句在条件语句中如果需要根据条件执行不同的操作临时变量可能会用于存储条件的结果或中间值。数组和容器操作在对数组、向量、列表等数据结构进行操作时可能会生成临时变量来存储临时元素或中间结果。错误处理在处理异常或错误时临时变量可以用于存储错误信息或状态。 临时变量的常性
临时变量有一个很重要的特性常量性
这一个特性确保了临时变量是不可以被修改这其中也就包括了权限不能被放大。
例如
int Add(int a, int b)
{int sum a b;return sum;
}int main()
{Add(1, 2);return 0;
}就会报错
这里解释一下左值和右值的概念 左值L-value左值是可以出现在赋值操作符例如的一侧的表达式表示一个可以被赋值的内存位置通常是一个变量。左值表示一个标识符或一个引用它指向内存中的某个位置。例如如果你有一个变量x那么x就是一个左值因为你可以将一个值赋给它如x 10。右值R-value右值是一个表达式的结果值它可以出现在赋值操作符的右侧。右值通常是计算的结果它可以是常数、临时变量或函数的返回值。例如如果你有一个表达式x y它的结果是一个右值因为它代表一个值但你不能将一个值赋给它。 报错信息显示函数的返回值不是一个左值也就是说返回的临时变量是不可被修改的。这也从侧面反映了临时变量的常性。
除此之外临时变量还有其他一些特性大家仅作了解即可 短暂寿命临时变量通常在其创建点的作用域内存在一旦超出该作用域它们就会被销毁。这使它们成为一种短暂的存储设备。匿名通常临时变量没有显式的名称因为它们是在表达式求值或函数调用期间自动创建的。它们只是在内部存储中的值。用于中间计算临时变量通常用于存储中间计算结果或值的转换。它们帮助管理复杂的表达式确保正确的计算顺序。可被编译器优化现代编译器通常会进行优化以最小化临时变量的使用以提高性能。它们可以消除不必要的临时变量以减少内存开销。值语义临时变量通常采用值语义这意味着它们存储的是具体的值而不是引用或指向其他变量。这有助于避免共享状态和副作用。用于函数返回在函数返回值的情况下临时变量通常用于存储函数的结果以便将其传递给调用方。隐式创建和销毁编程语言和编译器通常会自动创建和销毁临时变量程序员无需显式管理它们的生命周期。类型与原始值相关临时变量的类型通常与它们所包含的值的类型相关以确保类型的一致性。 总结
通过对临时变量的了解我们就可以解释最开始提到的问题了
int a 1;
double b a;当用整形变量a初始化浮点型引用b时涉及到了隐式类型转换那么中间就会产生一个double型临时变量来临时存储a的值但由于临时变量具有常性其权限不能被放大因此double b a;这句就是错误的。我们应该改为**const double b a;确保权限不变**。 本篇完。