为了账号安全,请及时绑定邮箱和手机立即绑定

符号常量可以在main()中进行赋值么?

rt,如果不删除第五行 编译出错

正在回答

6 回答

严格意义上来讲,C语言并没有绝对的常量这个概念。const是一个C语言的关键字,它限定了一个变量不允许被改变。

例如:下面代码

#define N 10

int main()

{

  int arr[N];  //编译通过,因为这里N被宏替换为10 

  return 0;

}

但是,

int main()

{

   int const N =10;

   int arr[N]; //编译不通过,因为编译器认为N是个变量,不是常量。只不过这个变量不允许被修改

}

而且在C语言中被const修饰的就一定是常量吗?真的能不动如山吗?

例如下面代码:

const int a = 10;

int *pa = &a;

*pa = 20;

printf("%d/n",*pa);

printf("%d/n",a);

编译时候,只是有个警告并没有错误,而且运行时,a的值也修改为20了。


要真正保证不能修改a,代码修改如下:

const int a = 10;

const int *pa = &a; //或者int const *pa=&a;

*pa = 20;

printf("%d/n",*pa);

printf("%d/n",a);

-------------------------------------------------------------------------

说这番话的目的想告诉大家,C由于是个比较原始古老的语言,在设计初考虑的不像C++,Java等这些语言严谨。对于常量在C中,其实没有严格意义上的常量类型。const的目的只是限定一个变量不允许修改,换句话说,它的值对这个符号来说是只读的,但是并不能防止通过程序的内部(或者说外部)的方法来修改这个值。所以,我可以简单理解为const是修饰的变量只是一个只读的变量而已。

33 回复 有任何疑惑可以回复我~
#1

安52

换行符错了\n
2016-11-01 回复 有任何疑惑可以回复我~
#2

慕哥0928960

回答得好专业啊嘻嘻
2017-12-01 回复 有任何疑惑可以回复我~


588775cd0001173d04840288.jpg你确定能这么定义?
只能以字母下划线数字组成,以字母下划线开头

0 回复 有任何疑惑可以回复我~

在程序中无法改变符号常量的值。若想改变,需要在定义时改变。

3 回复 有任何疑惑可以回复我~

用最简单的理解方法就是:宏定义(即define)的作用就是在程序进行编译时,编译器自动将定义的内容,比如 10

粘贴并替换到你所写的程序中,也就是你所写的

#include <stdio.h>

#define POCKETMONEY 10    //定义常量及常量值

int main()

{

     //小明私自增加零花钱对吗?

    printf("小明今天又得到%d元零花钱\n", POCKETMONEY);

    //这上面这段代码在编译时就变成下面这行

     printf("小明今天又得到%d元零花钱\n", 10);

    return 0;  

}


0 回复 有任何疑惑可以回复我~

谢谢你的回复!

0 回复 有任何疑惑可以回复我~

#define POCKETMONEY 10

这一句并不是定义一个变量。

#define 是一个预处理指示,预处理器会把代码中的 POCKETMONEY 替换成 10,再交给编译器编译。所以你的代码就是

printf("小明今天又得到%d元零花钱\n", 10);

所谓“常量”的概念编译器是不知道的,因为交给编译器的代码中根本就没有'POCKETMONEY'这个符号。

这种写法通常是为了方便我们编程。假设代码中有很多地方写了 10 这个字面量,但突然你想要把 10 改成 20,那么就需要在整个代码中搜索10,还必须确定这个'10'是你想要改的那个量,实在是很麻烦,且容易出错。 所以就用#define定义一个10的“代号”,这样如果你想改动这个值,只需要把#define中的10改掉即可。

但是,这种写法是不推荐的!!

原因如上所说,因为编译器并不知道'POCKETMONEY'这个符号,所以也无法进行相应的类型检查之类的,除了错误也无法正确提示,会带来无穷无尽的问题...

推荐的写法是:

const关键字来定义一个变量,这种用const修饰过的变量的值是无法更改的,这样就有了“常量”的语义。

14 回复 有任何疑惑可以回复我~
#1

好喜欢taeyeon啊_ 提问者

thx
2015-01-11 回复 有任何疑惑可以回复我~
#2

dire

"因为编译器并不知道'POCKETMONEY'这个符号,所以也无法进行相应的类型检查之类的,除了错误也无法正确提示,会带来无穷无尽的问题..." 问:如果不是常量的话 就是普通的变量的话 c语言会怎么对它进行相应的类型检查呢?会带来怎么样的无穷无尽的问题呢
2015-05-22 回复 有任何疑惑可以回复我~
#3

onemoo 回复 dire

这就是一个整型字面量。它的类型一般是有符号的,但如果你用16进制或8进制的话,其类型也有可能是无符号。总之由于你没有真正地定义这个变量,所以它可能和你的预期不一致,进而带来非预料的行为。 也因为编译器不知道POCKETMONEY这个符号,所以出错的时候它也无法提示你'POCKETMONEY'有错。
2015-05-23 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消

符号常量可以在main()中进行赋值么?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信