递归火山软件开发平台

标题: 为何常量用作参数时,常量值可以被修改? [打印本页]

作者: 朕的    时间: 2021-6-27 01:40
标题: 为何常量用作参数时,常量值可以被修改?
本帖最后由 朕的 于 2021-6-27 01:45 编辑

写了个mysql的扩展,搞半天没找到bug原因,最后原来是赋值的常量被修改了,后面的命令再调用此常量已经变了。后来才发现是常量被修改了。特意试了下易语言,易语言里常量这种操作是不会被修改的,而且传入的程序可以调用赋值后的参数可以得到新的赋值,且常量没有被改。

(, 下载次数: 594)

作者: 李先森    时间: 2021-6-27 08:07
火山或者c++调用方法(子程序)参数应该是引用传递,你试试执行mysql语句有个“错误信息”参数,就是提供一个变量来接收错误信息的,和这个例子一样的原理
作者: Xelloss0618    时间: 2021-6-27 12:15
C/C++ 的 const 常量只提供语法层面的保护,编译器会检查一些对常量进行修改的常规操作,但还有其他一些操作是编译器检查不出的。
就是说你可以用各种奇怪的手段修改 C/C++ 的常量。
作者: 龙纹    时间: 2021-6-27 13:00
Xelloss0618 发表于 2021-6-27 12:15
C/C++ 的 const 常量只提供语法层面的保护,编译器会检查一些对常量进行修改的常规操作,但还有其他一些操 ...

按帖子中图片那样生成的代码并没有const,只是一个局部静态变量。所以修改是合法的,这里更像是语义的问题,他想要一个常量,编译器却只是生成了一个static修饰的变量。
作者: 创世魂    时间: 2021-6-27 13:27
参数相当于是个变量。所以这个时候输出的信息已经不是从常量输出了,而是从参数取这个数据。
作者: 朕的    时间: 2021-6-27 14:40
李先森 发表于 2021-6-27 08:07
火山或者c++调用方法(子程序)参数应该是引用传递,你试试执行mysql语句有个“错误信息”参数,就是提供一 ...

你说的是变量,变量是肯定可以被修改。这个说的是常量,常量被修改了
作者: 朕的    时间: 2021-6-27 14:42
创世魂 发表于 2021-6-27 13:27
参数相当于是个变量。所以这个时候输出的信息已经不是从常量输出了,而是从参数取这个数据。 ...

也就是说,常量被用作参数时,可以被修改是合理的是吗?
作者: 朕的    时间: 2021-6-27 14:48
创世魂 发表于 2021-6-27 13:27
参数相当于是个变量。所以这个时候输出的信息已经不是从常量输出了,而是从参数取这个数据。 ...

取值确实可以取,但为何能赋值成功就不知道了
作者: 秋天的童话    时间: 2021-6-27 18:01
是有点奇怪,加上又是字符串,楼主看看基本数据类型会变化吗?
作者: logan0279    时间: 2021-6-27 23:00
试了下,真的是这样。
定义好的常量被传参修改了。。。 。。。
作者: Xelloss0618    时间: 2021-6-28 00:42
看了下翻译的C++源码,文本型常量没有加上 const 关键词
整数和长整数常量有加上 const,不会被这种方法修改
文本型常量可能只是火山自身加了个语法检查,不能被直接赋值修改而已了,换成这种方法就检查不出了
作者: 伟业    时间: 2021-6-28 11:12
学习。。。。。




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4