由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 为啥允许这样的const设计
相关主题
C++一问Why the number is not exact in C++
请教一个const pointer的问题刚看完类这一章,有些大小问题,请指教,谢谢
[c++] reference 真得不能bound to a second object 么?C++ STL map find does not work ???
why int** cannot convert to const int** ?const X& operator+(const X& rhs) const;
求教python问题,在线等 (转载)请教一个C++ typedef的问题
请问const myClass &src 和myClass const &src有什么区别?问个a=b 的问题
C++ Q05: pointer to constant variable这个在c++ const不变,不能用相同地址的变量改,咋做的
请教cosnt的使用typedef
相关话题的讨论汇总
话题: const话题: ptr话题: int话题: type话题: 左边
进入Programming版参与讨论
1 (共1页)
m*********a
发帖数: 3299
1
int i=1;
const int *const ptr=&i;
i=10;//*ptr=10
ptr指的不是const,还是不允许*ptr=10这样赋值
const不是常量的意思,而是不能赋值的意思
如果你有其他变量来改变这个值的话,没有问题
这和大家要的常量相差太大了
真个有点儿搞
p***o
发帖数: 1252
2
Trust me, Java is a much better choice.

【在 m*********a 的大作中提到】
: int i=1;
: const int *const ptr=&i;
: i=10;//*ptr=10
: ptr指的不是const,还是不允许*ptr=10这样赋值
: const不是常量的意思,而是不能赋值的意思
: 如果你有其他变量来改变这个值的话,没有问题
: 这和大家要的常量相差太大了
: 真个有点儿搞

m*********a
发帖数: 3299
3
既然可以用auto,那么就drop所有type,所有的东西都用auto
最好把auto也drop
即用没有type的语言就行了
m*********a
发帖数: 3299
4
这些“专家”设计出一坨屎出来
还更新版本,越新的版本越少的人用
还更新的屁
S*A
发帖数: 7142
5
那是因为你没有明白 C 里面 const 的确切含义。
你自己望文生意出一个你觉得应该如此的用法。

你这个就是说,ptr 本身是个 const 指针,指的内容是 const。
我不会通过 ptr 来修改指的内容也不会修改这个 ptr 指针指向。
这个指针的初始值是 i 的地址。
废话,你用了 const int *ptr 当然就不允许 *ptr = 什么了。
因为编译器不是总可以看出 ptr 的内容是哪里来的。例如
可以是一个函数调用的返回值。你没法知道被赋予的内容
是不是 const。 就算不是,指针用了 int const * 就是说,
我不通过这个指针来修改指向的内容。
你真要常量可以用 enum。

【在 m*********a 的大作中提到】
: int i=1;
: const int *const ptr=&i;
: i=10;//*ptr=10
: ptr指的不是const,还是不允许*ptr=10这样赋值
: const不是常量的意思,而是不能赋值的意思
: 如果你有其他变量来改变这个值的话,没有问题
: 这和大家要的常量相差太大了
: 真个有点儿搞

b*******s
发帖数: 5216
6
keep distance from dirty c pls

【在 m*********a 的大作中提到】
: int i=1;
: const int *const ptr=&i;
: i=10;//*ptr=10
: ptr指的不是const,还是不允许*ptr=10这样赋值
: const不是常量的意思,而是不能赋值的意思
: 如果你有其他变量来改变这个值的话,没有问题
: 这和大家要的常量相差太大了
: 真个有点儿搞

T*******x
发帖数: 8565
7
我觉得wdong关于const的规则说的很好:
1. const 修饰左边紧邻的词语
2. 尽量不要用const修饰右边词语的用法。
所以你这个可以写成
int const * const ptr = &i
语义是清楚的。

【在 m*********a 的大作中提到】
: int i=1;
: const int *const ptr=&i;
: i=10;//*ptr=10
: ptr指的不是const,还是不允许*ptr=10这样赋值
: const不是常量的意思,而是不能赋值的意思
: 如果你有其他变量来改变这个值的话,没有问题
: 这和大家要的常量相差太大了
: 真个有点儿搞

S*A
发帖数: 7142
8

那 const int * ptr; 如何算?
const int *ptr 和 int const *ptr 是一样的。
你不需要这样区分左边和右边。 const 是作用在
当前的 declaration type 上面。
int * ptr 编译器 AST 是这样的:



const int * ptr 编译的 AST是


[const]
int * const ptr 的 AST 是

[const]


【在 T*******x 的大作中提到】
: 我觉得wdong关于const的规则说的很好:
: 1. const 修饰左边紧邻的词语
: 2. 尽量不要用const修饰右边词语的用法。
: 所以你这个可以写成
: int const * const ptr = &i
: 语义是清楚的。

w***g
发帖数: 5958
9
最左边的const作用于它immediately右边的东西,你给的例子是对的。
但这是条冗余规则,只要不允许出现最左边的const就不需要这个规则。
所有事情一样能做。
如果想要ptr本身不能改,又要const出现在最左边,就得先定义一个intPtr才行。
上次去google面试时还被问到这个问题,关键那个面试官自己都没弄清楚
const怎么用。我给她解释了半天她也不明白,然后反复说google的
style guide里建议把const放在最左边,所以就一定要那么写。
但他们style guide在这件事上明明就是错的。所以我印象中google的
engineer整体水平前几年下降非常快。

【在 S*A 的大作中提到】
:
: 那 const int * ptr; 如何算?
: const int *ptr 和 int const *ptr 是一样的。
: 你不需要这样区分左边和右边。 const 是作用在
: 当前的 declaration type 上面。
: int * ptr 编译器 AST 是这样的:
:
:
:
: const int * ptr 编译的 AST是

S*A
发帖数: 7142
10

这不是冗余的规则,其实是你不允许出现左边 const 是冗余的规则。
是你自己为了自己(片面)的理解方便强加出来的规则。所以最后为了
补全还是给最左边 const 加个反规则的例外。
const 是个 modifier, 是可以放左边的。其实 C 编译的时候是
把 const 作用在当前 type 的。当 * 出现以后,当前 type 就是
pointer type。所以 const 作用到 pointer 上。
对,const 作用在 typedef pointer就是很好一个例子。
其实只要你真正理解了 C 的编译器是如何工作的,这些左边右边规则
是不需要记住的,你为了记这个不是规则的规则还要加个违反规则的特
例给最左边const。
你只需要知道 modifier 作用在当前 type 上面就可以了。
其他就是最自然的实现。
style guide 指的是 style。就是等价时候可以这样可以那样的一个取向。
但是 pointer const 这个在 * 左边右边就不是 style 了,是 correctness
的问题了。当然不是 style guide cover 的。所以我不觉得 style guide
有问题。是 const 的理解有问题。

【在 w***g 的大作中提到】
: 最左边的const作用于它immediately右边的东西,你给的例子是对的。
: 但这是条冗余规则,只要不允许出现最左边的const就不需要这个规则。
: 所有事情一样能做。
: 如果想要ptr本身不能改,又要const出现在最左边,就得先定义一个intPtr才行。
: 上次去google面试时还被问到这个问题,关键那个面试官自己都没弄清楚
: const怎么用。我给她解释了半天她也不明白,然后反复说google的
: style guide里建议把const放在最左边,所以就一定要那么写。
: 但他们style guide在这件事上明明就是错的。所以我印象中google的
: engineer整体水平前几年下降非常快。

相关主题
请问const myClass &src 和myClass const &src有什么区别?Why the number is not exact in C++
C++ Q05: pointer to constant variable刚看完类这一章,有些大小问题,请指教,谢谢
请教cosnt的使用C++ STL map find does not work ???
进入Programming版参与讨论
w***g
发帖数: 5958
11
仔细想了一下。我的理解确实是片面的。但是规则应该没错。
所有最左边的const都可以移到它后边地一个类型标识符之后
而保持语义不变。typedef const XXX ...里的XXX必然是
一个类型标识符,所以可以写成typedef XXX const ...。
变量定义的话const和类型标识符XXX之间还可能有static/auto/register/thread_
local这些,需要跳过,但是把const挪到XXX之后还是保持语义不变。
我正在想反例,还没想出来。你给想个看看。

【在 S*A 的大作中提到】
:
: 这不是冗余的规则,其实是你不允许出现左边 const 是冗余的规则。
: 是你自己为了自己(片面)的理解方便强加出来的规则。所以最后为了
: 补全还是给最左边 const 加个反规则的例外。
: const 是个 modifier, 是可以放左边的。其实 C 编译的时候是
: 把 const 作用在当前 type 的。当 * 出现以后,当前 type 就是
: pointer type。所以 const 作用到 pointer 上。
: 对,const 作用在 typedef pointer就是很好一个例子。
: 其实只要你真正理解了 C 的编译器是如何工作的,这些左边右边规则
: 是不需要记住的,你为了记这个不是规则的规则还要加个违反规则的特

w***g
发帖数: 5958
12
不允许出现最左边的const确实不能解决所有问题。见下面的例子
const static int s1 = 1, s2 = 1;
const extern int e1 = 1, e2 = 1;
等价于
int static const s1 = 1, s2 = 1;
int extern const e1 = 1, e2 = 1;
第二种写法更容易混淆。static/extern作用于后面所有的变量(编译成.o后用nm看输出的
变量可以确定),而const作用于int。作用对象交错了。
int const *const s1 = 0, s2 = 1;
第一个const作用于int,所以跟s1和s2都有关。第二个const作用于*只和s1有关。
这个确实比第一个const写前面更变态。
我扛不住了,大家赶紧转java吧。

【在 w***g 的大作中提到】
: 仔细想了一下。我的理解确实是片面的。但是规则应该没错。
: 所有最左边的const都可以移到它后边地一个类型标识符之后
: 而保持语义不变。typedef const XXX ...里的XXX必然是
: 一个类型标识符,所以可以写成typedef XXX const ...。
: 变量定义的话const和类型标识符XXX之间还可能有static/auto/register/thread_
: local这些,需要跳过,但是把const挪到XXX之后还是保持语义不变。
: 我正在想反例,还没想出来。你给想个看看。

t********e
发帖数: 880
13
java final is a complete joke

【在 p***o 的大作中提到】
: Trust me, Java is a much better choice.
S*A
发帖数: 7142
14
你举的例子很好啊。
所以理解const的规则不是左边右边,
是当前parser作用的type node。
看看 C 的spec好了。C 其实比C++
简单实用多了。
const 是 modifier,只有几个modifier。
等你看看type attribute。例如 pure。
那些是C 比较复杂的。
Java 干不了C擅长干的事情。

出的

【在 w***g 的大作中提到】
: 不允许出现最左边的const确实不能解决所有问题。见下面的例子
: const static int s1 = 1, s2 = 1;
: const extern int e1 = 1, e2 = 1;
: 等价于
: int static const s1 = 1, s2 = 1;
: int extern const e1 = 1, e2 = 1;
: 第二种写法更容易混淆。static/extern作用于后面所有的变量(编译成.o后用nm看输出的
: 变量可以确定),而const作用于int。作用对象交错了。
: int const *const s1 = 0, s2 = 1;
: 第一个const作用于int,所以跟s1和s2都有关。第二个const作用于*只和s1有关。

m*********a
发帖数: 3299
15
你说的东西,我是知道
但是是个人就是想要pointer指得是const int
但是c++中这个const int不是const,是可以改变的
不能用这个pointer来改,谁care
但是const int i=10;
这个就是一个const,无法改变这个i=10这个值
如果这个值赋值给 pointer的花
必须是const int *p=&i;
不能通过int *p=&i;*p=100;来改变

【在 S*A 的大作中提到】
: 那是因为你没有明白 C 里面 const 的确切含义。
: 你自己望文生意出一个你觉得应该如此的用法。
:
: 你这个就是说,ptr 本身是个 const 指针,指的内容是 const。
: 我不会通过 ptr 来修改指的内容也不会修改这个 ptr 指针指向。
: 这个指针的初始值是 i 的地址。
: 废话,你用了 const int *ptr 当然就不允许 *ptr = 什么了。
: 因为编译器不是总可以看出 ptr 的内容是哪里来的。例如
: 可以是一个函数调用的返回值。你没法知道被赋予的内容
: 是不是 const。 就算不是,指针用了 int const * 就是说,

G****r
发帖数: 5579
1 (共1页)
进入Programming版参与讨论
相关主题
typedef求教python问题,在线等 (转载)
问个c++问题请问const myClass &src 和myClass const &src有什么区别?
C++里get array size的问题 (转载)C++ Q05: pointer to constant variable
C++ 菜鸟问一个关于template 的问题。请教cosnt的使用
C++一问Why the number is not exact in C++
请教一个const pointer的问题刚看完类这一章,有些大小问题,请指教,谢谢
[c++] reference 真得不能bound to a second object 么?C++ STL map find does not work ???
why int** cannot convert to const int** ?const X& operator+(const X& rhs) const;
相关话题的讨论汇总
话题: const话题: ptr话题: int话题: type话题: 左边