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整体水平前几年下降非常快。
|
|
|
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 | |