Chinaunix

标题: const 修饰的变量 [打印本页]

作者: hardie    时间: 2010-06-12 14:51
标题: const 修饰的变量
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         const int MAX;
  5.         scanf("%d", &MAX);
  6.         int a[MAX];
  7.         scanf("%d", &MAX);
  8.         printf("%d\n", sizeof(a));
  9.         return 0;
  10. }
复制代码

作者: liexusong    时间: 2010-06-12 14:59
const变量不是一般要初始化时赋值的吗? 而且const只是指定变量为只读而已!
作者: hellioncu    时间: 2010-06-12 15:23
LZ要说明什么?
作者: tajial    时间: 2010-06-12 16:07
回复 1# hardie
linux+gcc测试结果
5
20
7
28
第一次输入5,打印20;
第二次输入7,打印28
哪位高人能解释一下?
作者: egmkang    时间: 2010-06-12 16:25
你这些的是什么代码
int array[MAX];
这个是C99引入的可变数组,sizeof是动态计算的,所以大小是正确的
作者: tajial    时间: 2010-06-12 16:43
忘说了,稍改了一下,加了个打印
  1. [root@dpf usr]# cat tmp.c
  2. #include <stdio.h>
  3. int main(void)
  4. {
  5.         const int MAX;
  6.         scanf("%d", &MAX);
  7.         int a[MAX];
  8.         printf("%d\n", sizeof(a));
  9.         scanf("%d", &MAX);
  10.         printf("%d\n", sizeof(a));
  11.         return 0;
  12. }
  13. [root@dpf usr]# cc tmp.c
  14. [root@dpf usr]# ./a.out
  15. 5
  16. 20
  17. 7
  18. 28
复制代码
去掉const两次打印就都是20了
作者: rain_fish    时间: 2010-06-12 16:45
回复 4# tajial


    4*5 = 20
    4*7 = 28
作者: yunyue520    时间: 2010-06-12 16:50
我也不明白,想知道为什么
不加const修饰,两次打印的结果是一样
加了const修改,结果就不一样了
作者: tajial    时间: 2010-06-12 16:52
回复  tajial


    4*5 = 20
    4*7 = 28
rain_fish 发表于 2010-06-12 16:45

这个我会算
问题是为什么去掉const就没有这种情况了
作者: hellioncu    时间: 2010-06-12 16:59
有const的生成的汇编码多几行,为啥这样不清楚
作者: yunyue520    时间: 2010-06-12 17:01
是不是与scanf有关呀
一般给const变量赋值是出错的
作者: rain_fish    时间: 2010-06-12 17:29
测试了一下,的确如此,不加const,输出都是20,比较容易理解,数组已经声明并定义了,内存空间已经确定,再更改MAX值,数组a的内存空间不会再变。可是加上const后,怎么会变呢?
作者: 没本    时间: 2010-06-12 17:30
C不是强类型检查语言,和C++不一样。用C++编译会报错。
作者: rain_fish    时间: 2010-06-12 17:34
用g++编译时把const MAX 初始化后,问题依旧。。。
作者: egmkang    时间: 2010-06-12 17:43
对const修改,结果本身就是未定义的,不用搞了
作者: 蜡笔小新他爸    时间: 2010-06-12 18:30
CU怎么也有这种菜鸟!
作者: yunyue520    时间: 2010-06-12 19:22
谁规定小学没毕业就不能上CU呀
不懂就学,不怕被笑话
作者: ah13k    时间: 2010-06-12 23:24
你加不加const,那么第一次输入的就是
如果加了const,那么你两次都输入。
我不清楚你到底在问什么
作者: 蜡笔小新他爸    时间: 2010-06-12 23:39
谁规定小学没毕业就不能上CU呀
不懂就学,不怕被笑话
yunyue520 发表于 2010-06-12 19:22



    大哥,你有几个马甲?
作者: yunyue520    时间: 2010-06-13 00:53
我只有一个帐号呀
我不是楼主
我是看了帖子,试了一下,觉得好奇,我又不懂
作者: bladmin    时间: 2010-06-13 11:05
对const变量如果别用输入的方式呢?
在定义的时候直接赋值呢?
const变量赋值本身似乎就是不对的。

【菜鸟的意见】
作者: pandaiam    时间: 2010-06-13 12:27
期待高手解释。。
作者: chenjuecj165    时间: 2010-06-13 17:56
lz到底要问啥,看了半天没明白
作者: Magic_LP    时间: 2010-06-14 00:39
我也觉得有点奇怪哦,整理下,问题太零散了
  1. #include <stdio.h>

  2. int main(void)

  3. {

  4.         const int MAX;

  5.         scanf("%d", &MAX);

  6.         int a[MAX];

  7.         printf("%d\n", sizeof(a));

  8.         scanf("%d", &MAX);

  9.         printf("%d\n", sizeof(a));

  10.         return 0;

  11. }
复制代码
输出:


换成以下代码
  1. #include <stdio.h>

  2. int main(void)

  3. {

  4.        int MAX;

  5.         scanf("%d", &MAX);

  6.         int a[MAX];

  7.         printf("%d\n", sizeof(a));

  8.         scanf("%d", &MAX);

  9.         printf("%d\n", sizeof(a));

  10.         return 0;

  11. }
复制代码
则输出就不一样:


这样把问题描述清楚了吗?期待答案
作者: 蓝色神话    时间: 2010-06-15 21:16
这个问题比较有意思。
作者: pengjianbokobe    时间: 2010-06-16 23:23
关注   
作者: Esakyo    时间: 2010-06-17 02:13
你确定你的代码符合标准并且可移植?
作者: shitou254    时间: 2010-06-17 09:52
期待答案的路过
作者: egmkang    时间: 2010-06-17 10:58
回复 21# bladmin

看15楼
作者: jerrymy    时间: 2010-06-17 11:13
{:2_166:}关注中。
作者: shan_ghost    时间: 2010-06-17 11:26
我的测试结果:

1、某手机OS上的编译器:执行输出“fu*k you”

2、某嵌入式OS上的编译器:无反应。事后发现sim卡被锁死,SD卡读写次数过多,已报废

3、另一个嵌入OS上的编译器:执行后显示“正在执行自毁程序,0.05秒后爆炸,请就近寻找掩体”

4、最后,俺自己即将写出的编译器:执行后出现某网游登录界面。
作者: donglongchao    时间: 2010-06-17 11:40
我的测试结果:

1、某手机OS上的编译器:执行输出“fu*k you”

2、某嵌入式OS上的编译器:无反 ...
shan_ghost 发表于 2010-06-17 11:26


作者: shan_ghost    时间: 2010-06-17 11:47
本帖最后由 shan_ghost 于 2010-06-17 11:48 编辑
donglongchao 发表于 2010-06-17 11:40



    真的,不骗你。

因为C/C++标准说了,这些地方编译器作者可以合法的放彩蛋进去,给程序员一个surprise

当然,有些编译器作者比较懒,就会放一些很无趣的彩蛋(比如楼主那个);有些作者比较无聊,彩蛋也就很恶搞;还有的作者很恶劣,他可能会格式化你的机器
作者: shaohui973    时间: 2010-06-22 10:25
回复 7# rain_fish


    那个是整型常量也可以“改变值”?
作者: rain_fish    时间: 2010-06-22 10:48
回复  rain_fish


     那个是整型常量也可以“改变值”?
shaohui973 发表于 2010-06-22 10:25



    ??朋友说的什么意思?我的意思不是赋值,而是计算而已。。。
作者: shaohui973    时间: 2010-06-23 18:30
回复 35# rain_fish


    const int 此类变量是整型常量,还能赋值改变其值???
作者: shaohui973    时间: 2010-06-23 18:32
回复 35# rain_fish


    const修饰变量后,变量为常量,怎么还可以再次赋值,改变其值?我没编译过你的程序,只是有疑问,说的不对别拍我
作者: rain_fish    时间: 2010-06-23 20:36
回复  rain_fish


    const修饰变量后,变量为常量,怎么还可以再次赋值,改变其值?我没编译过你的程 ...
shaohui973 发表于 2010-06-23 18:32



    呵呵,没有调查就没有发言权,另不是我的,你编译一下lz的程序试试
作者: pmerofc    时间: 2010-06-23 21:00
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2