C语言里符号常量和常变量有啥区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言里符号常量和常变量有啥区别?相关的知识,希望对你有一定的参考价值。

符号常量与常变量的区别:符号常量不占用内存空间,在预编译时就全部由符号常量的值替换了,而常变量占用内存空间,也有数据类型,但是此变量在存在期间是不能重新赋值的。
1、常变量a的定义如下:
const int a = 5;
2、符合常量PI的定义如下:
#define b=3.1;
参考技术A

符号常量 是编译前有预处理器处理的

#define PI 3.1415926

#define 是一条预处理命令, 就是出现符号常量PI的地方用后面的数字替换只是简单地替换

然后进入编译器

而常变量由编译器处理,分配内存空间,有数据类型,可以和变量一样使用,但不可以改变值!

const float PI=3.14159;

追问

我有点不太理解,变量可以变,它不变的的话和常量还有什么共同点?

追答

常变量和常量的区别:

    使用时常变量更方便,例如一个常量若多次出现,想更改数值就得改多次,常变量改一次就好;

    编译差别,常变量分配内存空间,有数据类型,每个常量会独立存放,出现几次就有几个存放空间。

本回答被提问者采纳
参考技术B 常变量不能改变

C ++中的临时变量和常量有啥区别?

【中文标题】C ++中的临时变量和常量有啥区别?【英文标题】:What is the difference between temporary variable and constant in C++?C ++中的临时变量和常量有什么区别? 【发布时间】:2016-07-19 09:20:41 【问题描述】:

请允许我先发布我的代码:

void Fun(short &s)
void FunCon(const short &s)

int main()

  int iTest = 20;//note: iTest is int but parameter of Fun is "short &"
  Fun(iTest);//error, I know there is a temp variable(typecast)
  FunCon(iTest);//ok
  return 0;

我知道Fun(iTest);会生成一个新的临时变量(类型转换),但我想知道临时变量是否是一个常量

如果:为什么我不能将临时变量传递给short &

如果:我有另一个这样的代码:

class MyObject
  public :
  void F()
;

MyObject MOCreator()
  return MyObject();


int main()

   MOCreator().F();//OK
   return 0;

如果MOCreator()返回的临时变量是常量,为什么临时变量可以调用非常量成员函数? p>

我的问题是:

1) C++中临时变量常量有什么区别?

2)Thinking in C++中有一句话(第507页)。句子对吗?为什么?:

临时对象自动const

有人问我一个简单的问题,我在解决问题的过程中遇到了更多问题。我知道它们可能是一个非常常见的问题,我在网上搜索了很长时间。我也得到了很多不同的答案。但我现在对此更加困惑。

提前致谢。

【问题讨论】:

【参考方案1】:

我想知道临时变量是否是常数?

不,它只是一个临时变量,将在创建它的完整表达式结束时销毁。

为什么我不能将 temp 变量传递给 short &

临时不能绑定到非常量引用。但它可以被绑定为 const 引用,并且临时的生命周期将被延长以匹配引用的生命周期。这就是为什么FunCon(iTest); 很好。

为什么临时变量可以调用非常量成员函数?

没关系。唯一特别的是临时变量会在完整表达式结束时被销毁。

句子对吗?为什么? 临时对象自动为 const

没有。除非你明确声明它为 const。

【讨论】:

"临时对象自动为const"这句话对吗? @Joe 我不知道它的上下文,我只会说这句话是错误的。 @Joe See Are temporary objects in C++ const indeed?.【参考方案2】:

匿名临时对象是右值,只能绑定到右值引用或const 左值引用。所以你的临时short 可以绑定到short&&const short&

他们不是const;右值引用的主要目的是通过将昂贵的复制资源移出它们并进入新对象来改变它们。

【讨论】:

【参考方案3】:

鉴于以下情况:

void f(short& s) 
   s = 42;

现在考虑这个简单的用例:

short s = 0;
f(s);
std::cout << s << "\n";

这将打印 42 - 调用 f 具有修改 s 的副作用。

但是现在考虑以下,如果它是合法的:

int i = 0;
f(i);
std::cout << i << "\n";

这将打印 0,因为您将在 f 中修改的是临时的,原始的 i 未触及。

为防止这种行为,您只能将临时值传递给 const 引用或 rvalue 引用。

【讨论】:

以上是关于C语言里符号常量和常变量有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

常量和常变量有啥区别没

C语言里怎样理解长整型 短整型 和无符号型变量和常量?

C语言中用const声明全局变量赋初值和不赋初值有何区别?变量存放位置有啥不一样?

Delphi语言里的常量和变量

c语言源程序是有啥组成的

c语言中函数定义和声明有啥区别