奇怪?全局常量到底放在什么地方

梦想田园 2015-12-15 02:56:40
加精
const int changliang=4;
int main()
{
cout<<changliang<<endl;
// cout<<&changliang<<endl;
}
如果不加cout<<&changliang<<endl;调试时观察不到changliang的值,但是加上就可以了,我是在VC6下调试的
晕..............
...全文
2492 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
odisey 2016-02-05
  • 打赏
  • 举报
回复
这么多人说常量,我也来说说我的认识,常量分为四类: 1、字面量(也称文字量):例如,3.14是double型字面量,3.14f是float型字面量,3是int型字面量,'3'是char型字面量等等 2、枚举字面量:例如, enum dayOfWeek { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday }; 这里定义了枚举类型dayOfWeek,它有七个枚举字面量。 3、const量:例如, const int number=3; //number是int型的const量,也可称为const int型的变量,属于常量 int var=3; //var是int型变量,不属于常量 int* vpv=&var; //vpv是指向变量的指针变量,vpv自身不属于常量 // vpv=&number; //【错误】 const int* cpv=&number; //cpv是指向常量的指针变量,cpv自身不属于常量 cpv=&var; //可以 int* const vpc1=&var; //vpc1是指向变量的指针常量,vpc1自身属于常量 // int* const vpc2=&number; //【错误】 const int* const cpc1=&number; //cpc1是指向常量的指针常量,cpc1自身属于常量 const int* const cpc2=&var; //可以 4、符号常量:其实就是利用宏定义对字面量进行符号化。例如, #define PI 3.14 这是在给字面量3.14增加了一个符号PI
赵4老师 2016-01-25
  • 打赏
  • 举报
回复
说是一物即不中。 盲人摸太阳。
ynsenyu 2016-01-24
  • 打赏
  • 举报
回复
学习学习。哈哈
blueink_200451 2016-01-24
  • 打赏
  • 举报
回复
路过学习了。
  • 打赏
  • 举报
回复
我说装大鱼,你就别再东拉西扯了,我也不追究你闹的那些笑话。 言归正传。我们讨论的焦点在于宏定义的常量,诸如#define a 3这种形式,到底是不是常量的问题。按你的逻辑,这是常数。不是常量,常数不是常量云云。先不说你自造的这套概念在语言标准中没有依据,就说你那套胡说八道的解释:
引用 35 楼 FreeFice 的回复:
我说过常数常量的概念来自于数学,在数学中,constant表示常数,constants或const用于表示常量,在constant后加s不是表示多个常数,其实质意义表示一种集合概念。...在计算机上,你看到的constants就不是常数而是常量了,在数学理,常量常用C、const来替代constants,那么,在C/C++里出现const自然就是常量而不是常数。
明显一脑子糨糊,颠三倒四,不知所云。 1. 按你这套逻辑,constant的复数形式怎么写?constants的单数形式怎么写?你可别说没有哇。 2. 你这套猪猡哲学明显违背语言标准,C99 6.4.4 Constants Syntax 1 constant: integer-constant floating-constant enumeration-constant character-constant Constraints 2 The value of a constant shall be in the range of representable values for its type. Semantics 3 Each constant has a type, determined by its form and value, as detailed later. 6.4.4.1 Integer constants ... 请问这里constants和constant都说的是啥?用你那套猪猡哲学解释一下吧,看你怎么自圆其说。 说到底,你这人资质平庸、见识短浅,又没有自知之明,经常爱自作聪明,卖弄一下,你这些年闹的笑话不都是这个原因造成的么,没说错你吧。就说这个问题,为了显示自己与众不同,你非要别出心裁造出一个“constant是常数,const是常量”的概念,能显得你高明吗?你也不想想const关键字并非C语言一开始就有的,是从C++里借鉴的,C++也是从其他语言借鉴来的,难道没有const关键字的时候,C语言中就没有常量的概念?可能么,纯属搞笑。
  • 打赏
  • 举报
回复
引用 40 楼 FreeFice 的回复:
早期的NT本就来自于OS/2项目,有错吗?微软利用IBM的平台,项目延期了4年最后脱离OS/2项目,先是整出win.311迫使OS/2 wap匆匆面世,微软却借机1个月后推出win NT和WIN95,有关这场官司你可以着当年《计算机工程与科学》、《电脑报》上都有相关的文章,你别告诉我你那时还不晓得计算机那点事。
三年前就教育过你:谁告诉你的“window3/NT技术有近8成来自OS/2 Warp”?OS/2 Warp是一个支持抢先多任务的32位操作系统,windows 3.x则是协作多任务的16位操作系统,不另外安装win32s根本就运行不了32位程序(安装了也只具有很有限的32位能力),就是16位程序二者的处理方式也非常不同,windows 3.x是在共享地址空间中运行所有16位进程,而OS/2 Warp则是在独立地址空间中运行每个16位进程,基本结构上差别大了,怎么可能“window3技术有近8成来自OS/2 Warp”?至于NT,就跟OS/2更不沾边,NT的技术来自于DEC VMS,当年ms研制windows nt的时候,很多开发人员,包括首席设计师David Cutler都是从DEC挖去的,NT的很多基本结构,包括coff目标文件格式,都是从VMS直接继承过去的,和OS/2 Warp有个马关系呀? 这个事情是业内常识,别说你没有拿出所谓当年《计算机工程与科学》、《电脑报》上的文章,就算那些文章确实象你说的那样写过,也只能是文章作者不了解情况写错了。再次让你去了解一下Windows NT 和VMS的关系:http://www.windowsitpro.com/article/windows-2000/windows-nt-and-vms-the-rest-of-the-story
引用 40 楼 FreeFice 的回复:
C++已不支持句柄,这话我说过,这源自于我当年手中的watcom C++对tc代码的不支持,必须显示的将int型转为(void*)赋值给文件指针,而在C中,指针是可以直接赋值给整型,整型也可以赋值给指针,虽然有警告。但是C++已经不允许这样做,除非强制转换。毕竟程序员是上帝,即便你要0地址做程序控制码强制执行,计算机虽然会崩溃但其还是会照做,但这不代表其就支持这么做。 我这里有一段测试吗说明C 支持句柄而C++不支持的例子:
 #include <stdio.h>
int I;
char *S;
int main()
{
        S = malloc(128);
        scanf("%127[^\n]",S);
        S[127]='\0';
        I=S;
        printf("%s\n%d\n",I,I);
        I += 3;
        printf("%s\n%d\n",I,I);
        free(S);
        return 0;
}
这段代码是安全的,但在C++中是不允许的,加显示转义符那又令当回事。
你的脑子比三年前还退化了,即将退出灵长目,三年前你还能在大家的教育下认识到“C++已经不再支持句柄”是错的,现在你又开始狡辩了。 “C++已经不再支持句柄”意味着什么?先不管句柄(HANDLE)的实际类型是指针还是整数(在windows中的实现是指针---typedef PVOID HANDLE;),“C++已经不再支持句柄”意味着C++不能支持指针或者整数。你整一段整数和指针转换的代码能说明个P!谁告诉你的“句柄就是用整数处理指针、地址的一种用法”???又是你那蠢脑自造的概念。句柄是一种数据类型,不是运算,你三年都理解不了么。也不奇怪,以你那“指针常量是const * const”的水平也就只能这样了。 ms对HANDLE的解释很明确: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724457%28v=vs.85%29.aspx Handles and Objects An object is a data structure that represents a system resource, such as a file, thread, or graphic image. An application cannot directly access object data or the system resource that an object represents. Instead, an application must obtain an object handle, which it can use to examine or modify the system resource. Each handle has an entry in an internally maintained table. These entries contain the addresses of the resources and the means to identify the resource type. 简单说,每个HANDLE代表内部资源表中的一项(索引),这就是为什么ms把HANDLE的实际数据类型设计为指针的缘故。懂了吗。
庄鱼 2015-12-19
  • 打赏
  • 举报
回复
引用 39 楼 DelphiGuy 的回复:
FreeFice,既然你这么厚颜无耻对我倒打一耙,我也不介意揭揭你的老底让你亮个相。大家感兴趣的话可以看看这个帖子:http://bbs.csdn.net/topics/390205461 从#24开始看看这位不但自造概念,还“发现新技术”、创造“自己的技术标准”的大拿的精彩表演: “C++已经不再支持句柄”、 “NT技术有近8成来自OS/2 Warp”、 “你在C++里使用int i;void *p;p=(void*)i;试试看” “汇编语言无法命名变量” ...
早期的NT本就来自于OS/2项目,有错吗?微软利用IBM的平台,项目延期了4年最后脱离OS/2项目,先是整出win.311迫使OS/2 wap匆匆面世,微软却借机1个月后推出win NT和WIN95,有关这场官司你可以着当年《计算机工程与科学》、《电脑报》上都有相关的文章,你别告诉我你那时还不晓得计算机那点事。 C++已不支持句柄,这话我说过,这源自于我当年手中的watcom C++对tc代码的不支持,必须显示的将int型转为(void*)赋值给文件指针,而在C中,指针是可以直接赋值给整型,整型也可以赋值给指针,虽然有警告。但是C++已经不允许这样做,除非强制转换。毕竟程序员是上帝,即便你要0地址做程序控制码强制执行,计算机虽然会崩溃但其还是会照做,但这不代表其就支持这么做。 我这里有一段测试吗说明C 支持句柄而C++不支持的例子:
 #include <stdio.h>
int I;
char *S;
int main()
{
        S = malloc(128);
        scanf("%127[^\n]",S);
        S[127]='\0';
        I=S;
        printf("%s\n%d\n",I,I);
        I += 3;
        printf("%s\n%d\n",I,I);
        free(S);
        return 0;
}
这段代码是安全的,但在C++中是不允许的,加显示转义符那又令当回事。这里解释一下句柄,对许多年轻人可能都不清楚这个概念,句柄就是用整数处理指针、地址的一种用法。我记得当初为这也争执过。然后我写了个测试码随手就贴了上去。 有关汇编无法命名变量,也来自于我当时手中的MASM2,微软的产品,整个里面除了可以call函数名外,只能对地址进行操作。我记得,当初你就是为这还曾经打过51cpu什么的官司,好像是单片机就是计算机之类,时间太久记不清了,那时我给单位做单板机开发,如果汇编能支持变量,我不会那么幸苦。当然,我从单位出来也近20年了,技术的发展常常令人嗔目结舌,这么多年没碰汇编了,也许汇编早已可以命名变量了。我94年后都是用TC++写内嵌式汇编的,主要就是解决变量命名问题。这算是我孤陋寡闻吧。 最初是什么时候开始打嘴仗的,是0几来着,那时老迈还在坛子里时做版主时,阿飞他们还在读书,瀛海威天空刚被北京在线收购不久,应该在03、04年前,记得那时的上网费用还挺高,而瀛海威天空还差我600点时却无处讨说法时,看到了CSDN,那时也几乎是半潜水状态,有时跟人抬抬杠、改改代码之类的。有天不知是英雄斯基还是谁,给我留言说有个人到C/C++水版说C++的坏话,我觉得有意思,因为delphi也是我接触的语言,与BC都是堡兰国际的产品,而且我最初的C环境还是用turbo pascal写的呢,如果不是朋友好心送了我一套TC++1.0,估计我都要拿那玩意做项目开发的。开始以为是某个大牛到C版砸场子,一问,就是DelphiGuy了。 最初一些贬低C++的话,那是观点问题,无伤大雅,虽然有争吵,我觉得年轻人言辞激烈些未必是坏事,有血性总比温吞水的好。也许看我温和,三角比较多吧,不知怎么的我就被点名骂成了钝胎,好像最初的交恶就是从这时候起的吧,当别人出脏字的时候,我好像没骂过你吧,即便你骂钝胎,我也只是说自然界里的东西天生都是钝的圆润的吧,以此来反驳你称你为锐胎的,不是吗?也许这话有些阴损了些,之后好像有2、3年没来C版吧,这之后隔个几年来C版就找我理论找回场子,场子找回了吗?你所说的东西,当初全都解释过,今天再解释一遍也无妨。 你应该知道编程历史的,上世纪80年代末有关C与宏编译之争,在PC编译器领域不是小事,最终分化出2大代表,一个就是微软,一个是堡兰国际。最初的DOS都是BASIC写的,微软用宏编译简化汇编技术搞出了win1.0、2.0,后来又搞了 MSC7、Office等。这些在当年都有相关文章的,你别说你不知道:你那时在读书! 宏编程并不是坏东西,相反其因为跟机械吗和汇编直接相关,因此可以说和高效。宏的缺点就在于其较弱的类型相关性,这也是VC3.0以前一直不如BC稳定的原因。VC稳定还是后来的事,那是微软与英特尔合作之后,英特尔在微码级向微软提供支持,微软的产品才真正稳定起来,而不是动不动就蓝屏了(OS/2就没这现象)。就算如此,微软的产品还是时不时出问题,这一直到win7以后才算有较大改观。前几天,我不小心点击了360的免费升级功能,将系统升到win10,我立马就发现又悲剧了:系统居然不能休眠!一旦休眠铁定在唤醒时死机。过不久,微软将这问题解决了,可能还会有人那我说过Win10不支持休眠说事。我等着。
  • 打赏
  • 举报
回复
我说FreeFice,你能不能不要落慌而逃还要摆个POSE?以为你满嘴跑火车自造一些概念就能混淆视听骗得了大家? 1. 你一开口必闹笑话,哪次能例外?谁告诉你的“指针常量是const * const”???const * const是常量对象(姑且这样翻译吧,我见到有文章上用),指针不能被(直接)改变、指针指向的数据也不能通过该指针改变,你每次犯傻还要摇头晃脑自以为得计,可笑得很。至于指针常量和常量指针,中文上有歧义,不同的资料上有相反的解释,所以要以英文为准,pointer to constant是指向常量的指针(const *ptr),constant pointer是指针本身是常量(*const ptr)。 2. 那个例子是C99标准里的,用来说明pointer to constant和constant pointer的区别,你还要教育人家标准化委员会一下?白痴没边了。 3. 我举那个例子也不是用来说明常量指针和指针常量的,我也没有谈到这个(所以你所谓的“震惊”纯属自行宣布胜利,连借题发挥都谈不上),我是让你看标准化委员会在注释中的用语,constant要翻译成什么?按你那自造的概念是“常数”,那constant pointer是什么?你胡编乱造的那套概念能解释得通而不和标准发生冲突? 4. 再给你一个确定无疑的例子证明你自造的“常量“、”常数”概念的荒唐: a. 请问constant expressions是什么?你怎么翻译? b. 你所谓的“常量”、“常数”之间有没有兼容性?互相兼容还是谁兼容谁? c. 就按照你所定义的“常量”概念,请问常量表达式的求值结果是什么? 我看你怎么自圆其说。 ---待续
  • 打赏
  • 举报
回复
FreeFice,既然你这么厚颜无耻对我倒打一耙,我也不介意揭揭你的老底让你亮个相。大家感兴趣的话可以看看这个帖子:http://bbs.csdn.net/topics/390205461 从#24开始看看这位不但自造概念,还“发现新技术”、创造“自己的技术标准”的大拿的精彩表演: “C++已经不再支持句柄”、 “NT技术有近8成来自OS/2 Warp”、 “你在C++里使用int i;void *p;p=(void*)i;试试看” “汇编语言无法命名变量” ...
  • 打赏
  • 举报
回复
最可笑的是你的如下tree new bee,充分反映了你的厚脸皮和精神状态。
引用 35 楼 FreeFice 的回复:
DelphiGuy,我不想说你对数学对编程知识的匮乏,你也是这坛子里的老人了,你纠缠与我打嘴仗,也不是一次两次了,你怎么就不长教训,你有几次成功的在说道理上占过上风,有几次在逻辑上驳倒我?
这话应该我教训你才对呀,你这些年闹了多少笑话?“单片机上实现不了操作系统”、“C++已经不再支持句柄”、“NT技术主要来自于OS/2”诸如此类的,就在这个帖子里你又新造了不少,没说错你吧,要不要我把你那些笑料帖都翻出来给大家看看?你不服气的话也可以把你所谓的占上风、驳倒我的帖子找出来。
引用 35 楼 FreeFice 的回复:
DelphiGuy,我不想说你对数学对编程知识的匮乏,你也是这坛子里的老人了,你纠缠与我打嘴仗,也不是一次两次了,你怎么就不长教训,你有几次成功的在说道理上占过上风,有几次在逻辑上驳倒我?你跟我谈概念、谈技术、谈语言你不做功课的啊?你现在还写程序吗?我所说的那些你上机做过测试吗?你别动不动就讲标准,标准是给不懂人看的,是给对外发布的接口定的,对内,标准是用来打破的,你不打破就不会发现新技术,你就永远跟在别人后面没有自己的技术标准。
瞎忽悠能证明你高明啊,还是能掩盖你的愚蠢呐?你自造的那套“概念”确实打破了标准,不过是用胡说八道、满嘴跑火车打破的。你讲一讲你发现了什么“新技术”?有什么“自己的技术标准”?你“自己的技术标准”有什么价值?谁采用?
iamnobody 2015-12-17
  • 打赏
  • 举报
回复
C++对以下内容没作具体要求:
全局变量放哪里
调试时会发生什么
编译器是否优化对可见效果不影响的代码


也就是说,这是编译器的自由,讨论这个问题没有意义
庄鱼 2015-12-17
  • 打赏
  • 举报
回复
另外,不要迷信英文,不要迷信标准,在最初参与标准及语言设计的确实是数学家,但是现在在标准制定者更多的是工程学专家,别将他们想想的有多神圣,在描述发布排版中出现差错很正常,就像我上面的回复会出现输入法自己代我确定产生的笔误一样,如果自己没有甄别的能力,可能就会把笔误当真理了,虽然不排除像欧阳峰一样搞出一个倒练九阴真经,但那毕竟与实际相差甚远,当然诸位也可以说我在倒练九阴真经!
庄鱼 2015-12-17
  • 打赏
  • 举报
回复
引用 34 楼 DelphiGuy 的回复:
[quote=引用 31 楼 FreeFice 的回复:] 哈!常数就是常数,是一种数值,其不可能被其它数值或变量更改,而#define宏明显就不属于这一类,你自己语言不过关是你自己的事,既然计算机借用数学描述就必须遵循数学命名约定,而且#define宏也不是一成不变的。这点可以从编译器宏__FILE__、__LINE__可以看出,即便是__STDC__也只是约定其为1以统一标准,这跟常量有什么关系?不能将宏做常量的事就等同与常量(更何况__STDC__是做常数的事),如果硬要这样说,那么跟你这种人无话可说。 你别动不动就说标准,你看懂了吗?标准是排他的吗?可以作为解决问题的依据吗?如果这样想,模板就不会被发展成模板元编程技术。计算机不是科学是工程,是需要实践验证的技术,你拿那东西做证据除了显示你只会翻资料还能说明什么呢?我不遵守标准又怎么啦,我能用非标准的技术做很多的事,证明很多别人忽略的问题,推动技术变革,你遵循标准又做了什么呢?能证明我说的是错的还是我讲的东西不存在? 真的很烦你,多少年了都没长进,老是动不动就翻书说某某讲、某某书上说,你拿一段代码来验证一下你的思想也好啊,哪怕是伪代码也成啊,你别告诉我说你没环境,是在手机跟我聊天。 常量是一种参量只是这个参量或变量在定义周期内不可修改,通俗点是只读变量,const目的就是限制其修改,常量和常数不同,常数任何情况下都不可修改,数字、字符就属于这一类,虽然我们一般做数值讲,但其确实是常数。常量则是一种标识符用来代替具体的数,其必须满足2个要件:首先其是一个类型标识符,其次其是被赋值的特定标识符。宏不是常量的原因在于其非类型标识符,同时宏在扩展时不具备常量的唯一确定性。 C99里指的是常数而不是常量,你要硬要说那是常量那是你的事,但请你不要拿你的观念来说我的不是,解决争议的方法用代码证明 ——因为这是可验证的。 如果不是许多编译器内部case分支限定的话,你将__STDC__#define成2,在预编译是一样能过(因为头文件只跟有没有#define __STDC__有关而跟具体值无关)。你完全可以用2这个值去 CC然后用1这个值去LINK。 你攻讦的那些,恰恰是你自己概念不清的地方,也许有人认为常数是常量,我不认为,我指出常量的要素常数不具备、宏也不具备,严格意义的说enum命名是标识的是常量而不是常数,常数是指 布尔常数、整型常数、浮点常数、字符常数 ,枚举命名是常量,数值集是常数。当然C里没有bool类型,非赋值的枚举是顺序递增的称之常数并不为过。 constant是常数,const是常量,阿佛加德罗常数使用的是constant而不是const,虽然这两个词都翻译为常数、常量,但在实际应用中是有区别的,既然你喜欢考据,那就麻烦你认真一点。
瞧您这唠唠叨叨一大堆,一句话评价就是:胡说八道、没有依据。 1. 您所谓的常数、常量的概念区别是从哪里来的?哪个语言标准里定义的?您拿出来让大家看看。否则就是您自造的概念,说好听一点是您的个人理解,准确一点说就是臆测、想当然。您是C语言的设计者?还是C标准化委员会您说了算?您拿一些自造的概念出来喋喋不休能代表什么。 2. “我不遵守标准又怎么啦,我能用非标准的技术做很多的事,证明很多别人忽略的问题,推动技术变革,...”这个就属于撒泼打滚了,只是以您年近五旬高龄的老脸玩这套把戏有意思么?能显得您很可爱?而且您推动了什么“技术变革”?用胡说八道、自造概念推动的么?您胡说八道别人也确实不能把您怎么样,您以前也闹过很多笑话的嘛,诸如“单片机上实现不了操作系统”、“C++已经不再支持句柄”之类的,您不都坚持过来了嘛,还若无其事在论坛上继续瞎喷,就在这个帖子里,您刚在#19说过“宏是一段代码集而不是数或表达式什么的自然也就不会是常量或常数了”,在#27又整出个“常数宏(macro)”来,这么现场自打脸您都能面不改色,别人还能把您怎么样呢。 3. “你别动不动就说标准,你看懂了吗?标准是排他的吗?可以作为解决问题的依据吗?”这就是胡说八道的升级版---强词夺理。我要没看懂的话,您现在还在继续喷“宏是一段代码集而不是数或表达式什么的自然也就不会是常量或常数了”呢,我拿标准出来说话不是帮您纠正了一个错误认识么,标准不是把您自造的“宏”概念排除了么,这是不是解决问题的依据?您说说吧。 4. “C99里指的是常数而不是常量”、“constant是常数,const是常量,...”、“你攻讦的那些,恰恰是你自己概念不清的地方,也许有人认为常数是常量,我不认为,...”又在强词夺理了,你不认为那是你的事,但是你的“概念”是从哪里来的?标准什么地方有说明?很明显,你所谓的“常数”只不过是常量的值,并不是什么和常量并列的东西,比如,在C99 6.7.5.1 Pointer declarators部分有如下说明: 3 EXAMPLE The following pair of declarations demonstrates the difference between a ‘‘variable pointer to a constant value’’ and a ‘‘constant pointer to a variable value’’. const int *ptr_to_constant; int *const constant_ptr; 按你那套逻辑,ptr_to_constant指向constant value说错了,constant_ptr也不能称之为constant pointer,要叫const pointer!事实是这样的么?纯粹是你的想当然。 [/quote]天啦!我对你的语言理解能力感到震惊! 3 EXAMPLE The following pair of declarations demonstrates the difference between a ‘‘variable pointer to a constant value’’ and a ‘‘constant pointer to a variable value’’. const int *ptr_to_constant; int *const constant_ptr; 你理解懂了吗? 你别告诉我这么多年你还没搞清楚const *与* const的区别?更不知道指针常量是const * const! 我真的跟你没法交流,我没有谭老师或侯捷他们有那么好的耐心来从头给你讲解C与C++。你看你引用的标准,你看你看的英文书,即便我如此糟糕的英文能力都看懂的东西你却看不懂,那么我不会怀疑你的英文能力了,只能说你语文太差了。你不是看不懂而是你理解不了。所有的标准不是天生的,其都来自于实践,标准里来落后与实际应用。最初的C++里还没有模板呢,现如今呢,其已经成为C++里不可分割的一部分,更是各种标准库的主体。你拿标准来反驳你以为有力度吗?这只能说明你在技术上的奴性,从来不去尝试挖掘语言及编译工具的底限,你自然就不会发现很多语言真相,那么你说的东西对我来说就是笑话,因为那早在很多年前就给翻烂了。 我说过常数常量的概念来自于数学,在数学中,constant表示常数,constants或const用于表示常量,在constant后加s不是表示多个常数,其实质意义表示一种集合概念。数是不可数名词,将numbers认为是number的复数形式是对数学概念的不了解,numbers的确切意思是数集,我知道你又要拿这来喷了,由于这话有涉嫌攻击很多翻译学家的成分,我在这里做一个解释:1是单数还是复数,2是单数还是复数,100呢?作为数的概念是不存在单复数问题的,也就是说无论这个数是1还是1000000,其都只是一个数(number),当我们用numbers描述时,要么是指这个数字由什么数字组成,要么问含有那些数字,或这些数字相互关系,这都是数集概念,翻译成数字是不严谨的。在数学上,数是指确定的数值,数集则是一种参数或替代数概念,不指定某一确定数,在数学研究中,为了描述一类事物相互关联性,使用函数方程的方式表述数集与数集之间的关联,这就产生了常量与变量的概念。而这被计算机技术所引用。那么,在计算机上,你看到的constants就不是常数而是常量了,在数学理,常量常用C、const来替代constants,那么,在C/C++里出现const自然就是常量而不是常数。 有一个观点认为常量是不可变更的数,这个概念是错误的。无论是数学上还是计算机里,常量都是指在其命名有效期以内含义不变,也就是说,A公式的常量并不适用于B公式,同样,在函数或类型中亦或是命名空间,常量都是对内不变有效。然而,随着应用模块外发,在现实应用中难免遇到需要调整升级的情况,在C里,通常是将这些可调整的部分用#define宏描述,到时更改数值重编译就行,而在C++里,有另一个做法,就是将可更改的参数用const保护,在必要的时候通过一种机制实时的修改常量值,从而达到降低开发升级成本的目的。 DelphiGuy,我不想说你对数学对编程知识的匮乏,你也是这坛子里的老人了,你纠缠与我打嘴仗,也不是一次两次了,你怎么就不长教训,你有几次成功的在说道理上占过上风,有几次在逻辑上驳倒我?你跟我谈概念、谈技术、谈语言你不做功课的啊?你现在还写程序吗?我所说的那些你上机做过测试吗?你别动不动就讲标准,标准是给不懂人看的,是给对外发布的接口定的,对内,标准是用来打破的,你不打破就不会发现新技术,你就永远跟在别人后面没有自己的技术标准。我们俩在本质上不可能成为一路人,因为你太依赖与现成的技术,而我总想试试新想法。虽然我的机器常被我搞崩溃,但我也因此发现了很多所谓的安全技术是多么的虚假。你拿你那一套在我这里行不通,你谩骂也好,愤怒也罢,麻烦你坐到电脑前不是查资料,而是写段代码验证一番。以前你跟我较真技术,如今改较真概念了,算是你进步学聪明了,因为概念比较抽象,不容易用代码验证的方式比较对错优劣。但是,你别忘了,我这么多年还时不时的写点测试代码,帮人在不同平台上解决冲突问题,我的观点你可以不认同,但在我的这种观点却解决和证实了很多实际的问题。你抱着书本在看的时候,你有没有想过去证实你看的东西的真实有效性?你今年已经不年轻,早已不是一个做学生的年纪,你该有自己的思考了,而不是人云亦云的跟在别人后面背书找资料。 DelphiGuy,十年了,该有自己的想法了,不然,你难道想一辈子帮人背书没有点自己的东西?
  • 打赏
  • 举报
回复
引用 31 楼 FreeFice 的回复:
哈!常数就是常数,是一种数值,其不可能被其它数值或变量更改,而#define宏明显就不属于这一类,你自己语言不过关是你自己的事,既然计算机借用数学描述就必须遵循数学命名约定,而且#define宏也不是一成不变的。这点可以从编译器宏__FILE__、__LINE__可以看出,即便是__STDC__也只是约定其为1以统一标准,这跟常量有什么关系?不能将宏做常量的事就等同与常量(更何况__STDC__是做常数的事),如果硬要这样说,那么跟你这种人无话可说。 你别动不动就说标准,你看懂了吗?标准是排他的吗?可以作为解决问题的依据吗?如果这样想,模板就不会被发展成模板元编程技术。计算机不是科学是工程,是需要实践验证的技术,你拿那东西做证据除了显示你只会翻资料还能说明什么呢?我不遵守标准又怎么啦,我能用非标准的技术做很多的事,证明很多别人忽略的问题,推动技术变革,你遵循标准又做了什么呢?能证明我说的是错的还是我讲的东西不存在? 真的很烦你,多少年了都没长进,老是动不动就翻书说某某讲、某某书上说,你拿一段代码来验证一下你的思想也好啊,哪怕是伪代码也成啊,你别告诉我说你没环境,是在手机跟我聊天。 常量是一种参量只是这个参量或变量在定义周期内不可修改,通俗点是只读变量,const目的就是限制其修改,常量和常数不同,常数任何情况下都不可修改,数字、字符就属于这一类,虽然我们一般做数值讲,但其确实是常数。常量则是一种标识符用来代替具体的数,其必须满足2个要件:首先其是一个类型标识符,其次其是被赋值的特定标识符。宏不是常量的原因在于其非类型标识符,同时宏在扩展时不具备常量的唯一确定性。 C99里指的是常数而不是常量,你要硬要说那是常量那是你的事,但请你不要拿你的观念来说我的不是,解决争议的方法用代码证明 ——因为这是可验证的。 如果不是许多编译器内部case分支限定的话,你将__STDC__#define成2,在预编译是一样能过(因为头文件只跟有没有#define __STDC__有关而跟具体值无关)。你完全可以用2这个值去 CC然后用1这个值去LINK。 你攻讦的那些,恰恰是你自己概念不清的地方,也许有人认为常数是常量,我不认为,我指出常量的要素常数不具备、宏也不具备,严格意义的说enum命名是标识的是常量而不是常数,常数是指 布尔常数、整型常数、浮点常数、字符常数 ,枚举命名是常量,数值集是常数。当然C里没有bool类型,非赋值的枚举是顺序递增的称之常数并不为过。 constant是常数,const是常量,阿佛加德罗常数使用的是constant而不是const,虽然这两个词都翻译为常数、常量,但在实际应用中是有区别的,既然你喜欢考据,那就麻烦你认真一点。
瞧您这唠唠叨叨一大堆,一句话评价就是:胡说八道、没有依据。 1. 您所谓的常数、常量的概念区别是从哪里来的?哪个语言标准里定义的?您拿出来让大家看看。否则就是您自造的概念,说好听一点是您的个人理解,准确一点说就是臆测、想当然。您是C语言的设计者?还是C标准化委员会您说了算?您拿一些自造的概念出来喋喋不休能代表什么。 2. “我不遵守标准又怎么啦,我能用非标准的技术做很多的事,证明很多别人忽略的问题,推动技术变革,...”这个就属于撒泼打滚了,只是以您年近五旬高龄的老脸玩这套把戏有意思么?能显得您很可爱?而且您推动了什么“技术变革”?用胡说八道、自造概念推动的么?您胡说八道别人也确实不能把您怎么样,您以前也闹过很多笑话的嘛,诸如“单片机上实现不了操作系统”、“C++已经不再支持句柄”之类的,您不都坚持过来了嘛,还若无其事在论坛上继续瞎喷,就在这个帖子里,您刚在#19说过“宏是一段代码集而不是数或表达式什么的自然也就不会是常量或常数了”,在#27又整出个“常数宏(macro)”来,这么现场自打脸您都能面不改色,别人还能把您怎么样呢。 3. “你别动不动就说标准,你看懂了吗?标准是排他的吗?可以作为解决问题的依据吗?”这就是胡说八道的升级版---强词夺理。我要没看懂的话,您现在还在继续喷“宏是一段代码集而不是数或表达式什么的自然也就不会是常量或常数了”呢,我拿标准出来说话不是帮您纠正了一个错误认识么,标准不是把您自造的“宏”概念排除了么,这是不是解决问题的依据?您说说吧。 4. “C99里指的是常数而不是常量”、“constant是常数,const是常量,...”、“你攻讦的那些,恰恰是你自己概念不清的地方,也许有人认为常数是常量,我不认为,...”又在强词夺理了,你不认为那是你的事,但是你的“概念”是从哪里来的?标准什么地方有说明?很明显,你所谓的“常数”只不过是常量的值,并不是什么和常量并列的东西,比如,在C99 6.7.5.1 Pointer declarators部分有如下说明: 3 EXAMPLE The following pair of declarations demonstrates the difference between a ‘‘variable pointer to a constant value’’ and a ‘‘constant pointer to a variable value’’. const int *ptr_to_constant; int *const constant_ptr; 按你那套逻辑,ptr_to_constant指向constant value说错了,constant_ptr也不能称之为constant pointer,要叫const pointer!事实是这样的么?纯粹是你的想当然。
lm_whales 2015-12-16
  • 打赏
  • 举报
回复
引用 10 楼 FreeFice 的回复:
#define定义的是宏,宏不是常量!因为编译时直接替换掉了,根本没有常量一说,早期C语言教材中将其做为常量,是因为翻译的人不懂C语言,这其中也包括著名的谭老师。 const限定词就是固化不变的意思,加 const前缀就是常量,只是现代的C++编译器对常量有更宽泛的用法,允许对其进行特定修改罢了。另外指针常量与常量指针是不同的概念,常量指针const *p,常指针 * const p,指针常量const * const p; 晕!提交的时候尾巴给割掉了。
你这个理解是错误的,不是谭老师的错,也许谭老师有很多错误,这个显然不是。 虽然,C语言,并没有在标准里,写上#define 常量是常量。 但这的的确确是常量 C除了enum 常量,字面值常量,sizeof( ) 表达式常量,以及以上常量的表达式构成的常量表达式 之外,根本就没有任何途径定义常量。 而宏 不是C语言的一部分,他只是预编译指令。 因此,C只能用宏定义常量。 所以,宏常量也是常量,虽然严格的说。宏不是C语言的一部分。 const 对于C 根本不是常量 常量,变量的来源,不是C,C++,不是pascal,也不是fortran 不是任何编程语言 它来源于数学 来源于,数学公式,物理公式
庄鱼 2015-12-16
  • 打赏
  • 举报
回复
#define定义的是宏,宏不是常量!因为编译时直接替换掉了,根本没有常量一说,早期C语言教材中将其做为常量,是因为翻译的人不懂C语言,这其中也包括著名的谭老师。 const限定词就是固化不变的意思,加 const前缀就是常量,只是现代的C++编译器对常量有更宽泛的用法,允许对其进行特定修改罢了。另外指针常量与常量指针是不同的概念,常量指针const *p,常指针 * const p,指针常量const * const p; 晕!提交的时候尾巴给割掉了。
庄鱼 2015-12-16
  • 打赏
  • 举报
回复
引用 6 楼 lm_whales 的回复:
C++常量, 包括const 定义的, 不同种类和用途的常量,表现是不同的 有些,常量可以完全不占用数据区内存, 除非要取它的地址,或者 有时候的 extern 常量 。 而常量数值,或者根据常量计算出来的某个数据(常量的影子), 可能 会出现在指令代码的操作数中。 C 常量,只有enum 常量,字面值, 和#define 常量,以及相应的常量表达式,是常量 const 定义的不是常量(不起常量的作用)。
#define定义的是宏,宏不是常量!因为编译时直接替换掉了,根本没有常量一说,早期C语言教材中将其做为常量,是因为翻译的人不懂C语言,这其中也包括著名的谭老师。 const限定词就是固化不变的意思,加 const前缀就是常量,只是现代的C++编译器对常量有更宽泛的用法,允许对其进行特定修改罢了。另外指针常量与常量指针是不同的概念,常量指针const *p,
庄鱼 2015-12-16
  • 打赏
  • 举报
回复
应该是你的编译器问题,你这样试试:
cout<<int (changliang)<<endl;
估计vc6将其作为字符处理了,由于不可见,所以看不到结果。
庄鱼 2015-12-16
  • 打赏
  • 举报
回复
引用 30 楼 DelphiGuy 的回复:
[quote=引用 27 楼 FreeFice 的回复:] _ _STDC_ _ The integer constant 1, intended to indicate a conforming implementation. _ _STDC_ _ 是不变整数1,用于表示一致性的实现,这是宏的特性,而且是常数宏(macro),而不是constant var.原文写得那么清楚,怎么有人还看不明白呢?const限制的一定是变量(或参量)才称之为常量,如果是数值,那就是常数,这是基本的语文与数学常识。如果在这一点上都不能达成共识,那么永远是鸡对鸭讲谈不到一起。宏是作为代码集的别名存在的,在实际编译的时候要被具体的代码所替换,所以对宏的取地址操作并不是总有效。__STDC__因为仅仅#define一次固然是可以作为常数,但同样__LINE__宏就成了所在位置的代码行,一个程序可以有若干个__LINE__每个所表示的值都不一样,因此#define是不能作为常量处理的,要看#define的宏具体表示的是什么。
又在卖弄您那一脑子糨糊了。看看你说了多少蠢话。 1. 标准中明明注释_ _STDC_ _宏是The integer constant 1,你非要整出个“_ _STDC_ _ 是不变整数1”,能掩盖你的愚蠢?我明确告诉你constant就是常量的意思,在3中进一步解释。 2. 这个所谓的“常数宏(macro)”是您新创造的吧,先不说语言标准中有没有这个东西,就说#19这段“宏是一段代码集而不是数或表达式什么的自然也就不会是常量或常数了”难道是蠢猪说的?您这么快就自打嘴巴了! 3. 所谓“const限制的一定是变量(或参量)才称之为常量,如果是数值,那就是常数,这是基本的语文与数学常识。”是个P常识!纯属你那怪脑自造的概念。我前面已经告诉你了语言标准里并没有你所谓的“常数与常量的语义概念”这种东西,你还敢出来胡说八道。再告诉你一次,constant就是常量的意思,没有什么常数、常量的区分,之所以汉译要用“常量”这个词,是因为它不仅有数字类型,还有其他类型,C99中的常量语义有四种类型:整数常量、浮点常量、枚举常量、字符常量,见6.4.4 Constants部分的说明。 4. C语言中const修饰的量不具有constant语义,而是readonly(当然编译器可能把一部分const修饰的量作为constants处理,不过这是代码优化层面的事,不是语义层面的东西),即语义上不能被(显式)修改,这个才接近你创造的"不变整数"的含义,很明显你把const修饰和constant语义搞反了。 [/quote]哈!常数就是常数,是一种数值,其不可能被其它数值或变量更改,而#define宏明显就不属于这一类,你自己语言不过关是你自己的事,既然计算机借用数学描述就必须遵循数学命名约定,而且#define宏也不是一成不变的。这点可以从编译器宏__FILE__、__LINE__可以看出,即便是__STDC__也只是约定其为1以统一标准,这跟常量有什么关系?不能将宏做常量的事就等同与常量(更何况__STDC__是做常数的事),如果硬要这样说,那么跟你这种人无话可说。 你别动不动就说标准,你看懂了吗?标准是排他的吗?可以作为解决问题的依据吗?如果这样想,模板就不会被发展成模板元编程技术。计算机不是科学是工程,是需要实践验证的技术,你拿那东西做证据除了显示你只会翻资料还能说明什么呢?我不遵守标准又怎么啦,我能用非标准的技术做很多的事,证明很多别人忽略的问题,推动技术变革,你遵循标准又做了什么呢?能证明我说的是错的还是我讲的东西不存在? 真的很烦你,多少年了都没长进,老是动不动就翻书说某某讲、某某书上说,你拿一段代码来验证一下你的思想也好啊,哪怕是伪代码也成啊,你别告诉我说你没环境,是在手机跟我聊天。 常量是一种参量只是这个参量或变量在定义周期内不可修改,通俗点是只读变量,const目的就是限制其修改,常量和常数不同,常数任何情况下都不可修改,数字、字符就属于这一类,虽然我们一般做数值讲,但其确实是常数。常量则是一种标识符用来代替具体的数,其必须满足2个要件:首先其是一个类型标识符,其次其是被赋值的特定标识符。宏不是常量的原因在于其非类型标识符,同时宏在扩展时不具备常量的唯一确定性。 C99里指的是常数而不是常量,你要硬要说那是常量那是你的事,但请你不要拿你的观念来说我的不是,解决争议的方法用代码证明 ——因为这是可验证的。 如果不是许多编译器内部case分支限定的话,你将__STDC__#define成2,在预编译是一样能过(因为头文件只跟有没有#define __STDC__有关而跟具体值无关)。你完全可以用2这个值去 CC然后用1这个值去LINK。 你攻讦的那些,恰恰是你自己概念不清的地方,也许有人认为常数是常量,我不认为,我指出常量的要素常数不具备、宏也不具备,严格意义的说enum命名是标识的是常量而不是常数,常数是指 布尔常数、整型常数、浮点常数、字符常数 ,枚举命名是常量,数值集是常数。当然C里没有bool类型,非赋值的枚举是顺序递增的称之常数并不为过。 constant是常数,const是常量,阿佛加德罗常数使用的是constant而不是const,虽然这两个词都翻译为常数、常量,但在实际应用中是有区别的,既然你喜欢考据,那就麻烦你认真一点。
赵4老师 2015-12-16
  • 打赏
  • 举报
回复
理解讨论之前请先学会如何观察! 计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 多用小脑和手,少用大脑、眼睛和嘴,会更快地学会编程! 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步Debug版对应汇编一行! 单步Debug版对应汇编千行不如单步Release版对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
加载更多回复(25)

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧