Redian新闻
>
为啥允许这样的const设计
avatar
为啥允许这样的const设计# Programming - 葵花宝典
N*T
1
老姐过来帮忙,想让她回国前出去转转,打算报个团,有其它一到两个女士一起去? 人
多可以省点钱。 二月什么时候都可以,或者三月的第一周。
行程是
纽约_费城_华盛顿_大瀑布_波士顿_(哈佛/麻省理工) (全年每周六参团) $338 买2送1
或 买2送2 (或单人参加 要528 美元)
或者
纽约_费城_华盛顿_大瀑布 5天4晚(全年每周六参团) $308 买2送1 或买2送2 (或单人
参加 要468 美元)
(价格包括 机场接送、酒店住宿、巴士、中文导游)
站内信箱联系, 谢谢
avatar
L*h
2
【 以下文字转载自 Money 讨论区 】
发信人: Leapoffaith (take a leap of faith), 信区: Money
标 题: Form 3520 foreign gift申报,以前该申报的没报怎么办?
发信站: BBS 未名空间站 (Wed Mar 8 18:29:45 2017, 美东)
比如2014该报的。没有报
有什么办法吗?
avatar
w*j
3
大家好,
我是大陆F1。老婆持香港护照,最近她准备先来陪读再申请Master,不知道该申哪一种
签证比较好。
我目前主要猜测签证可能会影响以下几点:
1. 申请学校
2. 学校医疗保险(是不是B1/B2不能申请家属保险?)
3. 逗留时间
4. 退税
不知道大家有什么建议,或者推荐一些资源,我自己查查看。
谢谢
avatar
s*k
4
战场很快就清理完毕,李察翻身上马,率领睡眠不足的队伍出发,狼群已经追蹑上来了
,接下来又将是一段漫长艰难的包围和脱离的拉锯战。
李察的行军方向一贯飘忽不定,这次队伍先向东北方前进,走出几公里后又转而向
北。
身材高大的野蛮人无法骑马,好在他们奔行的速度比普通人要快了不少,耐力也出
人意料的悠长,可毕竟不能与染血地区出产的矮脚马相比。这种马适合沙民乘骑,短途
冲刺毫无可取之处,耐力和适应力却远远超过人类国度的高大战马。
队伍保持中速前进,风牙则在周围数百米范围内警戒着。凭借它们比人类更加灵敏
的嗅觉和感应,李察可以模糊掌握到方圆约一公里内大规模活体的运动情况,这也是他
带领队伍微调移动方向的重要判断依据。
李察的目标是最终北上,进入铁三角帝国的领地。那里很可能找到镇熊骑士们的前
进基地,有至关重要的时光灯塔。而且那里是山区,有着茂密的森林和大量的凶狠魔兽
。在山地和森林的复杂地形中,红色哥萨克的追兵就无从发挥数量上的优势,而李察这
支队伍的强项将得到最大程度的发挥。强大的法师和神官,以及契约职业者始终是李察
手中的一个王牌。
直到现在,李察都不知道身后的红色哥萨克队伍是怎么每次都准确无误地缀上自己
,又是怎么悄然集结起如此庞大兵力的。
刚开始与红色哥萨克小股兵力遭遇时,并没有引起他足够的警觉,但攻袭变得连绵
不绝,而几个熟面孔不断在疗伤周期后出现。李察意识到零散的敌人,已经以某种他不
知道的方式开始组织起来。他只知道敌人可能随时随地,从各个方向扑向自己。
没有后援是李察最大的劣势,而他只有机械地一次次击退粉碎敌人的攻势,并且凭
藉着自己对区域局势的敏锐把握,带领部队不断移动,一次次从行将收拢的包围圈中跳
出来。然后再粉碎敌人的追击阻截,再从包围圈中跳出去。
一开始,只要可能,李察就坚定不移地向北方运动,但是敌人明显察觉到了他的意
图,北方布置的兵力显著比其它方向要多得多。这时,李察果断改变了行进路线,好几
次突然向东突击,击溃了正面敌人,又把红色哥萨克的主力甩在了身后。
于是在染血之地的北端,狼群和猎物就展开了反复的追杀与逆袭。双方都似乎达到
了自己的目的,李察被迫偏离了北方的目的地,然而他却又屡次逃出红色哥萨克的包围
,并且给与敌人大量的杀伤。
不用想也可以知道,追袭的动静正变得越来越大。红色哥萨克除了试图驱赶李察远
离铁三角帝国,还要让他偏离主要的通商路线。
据他们了解,李察在染血之地上并不是没有一点根基,这点人脉不足以使他得到实
质性的增援,但是传递消息却还是不难的。红色哥萨克并没有那个实力封杀整个染血之
地的情报网,他们要抢在李察背后的势力得到消息前,干掉这个敢于挑战红色哥萨克声
望的狂妄小子,一旦游猎变成战争就不符合他们的利益了。
发现红色哥萨克的企图后,李察立刻本着敌人最不想让你做的事就越要实施的原则
,只要一有机会就去靠拢商路,不能接触到主线,也要从支线附近经过。当然,他并没
有什么消息需要传递,而是为了牵制敌人的兵力部署,偶尔也可以得到额外的人员和物
质补给。
李察曾经路遇两个小规模的商队,在简单的劝说后,就得到了商队的补给和护卫。
在李察身后就是红色哥萨克的追兵,如果这两个小商队让红色哥萨克看到了,必然会被
灭口。在染血之地,这种事非常常见,大的奴隶商人通常都会兼职马匪。
所以在连续战斗减员后,李察仍然率领着近五百人的部队。战争是最佳的熔炉,而
人则是矿石。矿石投入到熔炉中后,部分凝炼成精铁,部分化为废渣。而在染血之地,
废渣基本会变成尸体。
骑在战马上,向北行进的时候,李察正在默默计算着自己手上的力量。先后有八百
二十一个人加入到他的队伍中,而现在只剩下四百六十名战士,中间的差额都变成了尸
体。最终活下来的都成为冷静凶残的战士。
对李察自己来说,连续高强度的指挥下,惟一的收获就是智慧天赋有了突破,进入
第二阶段。
新的阶段似乎和第一阶段没有本质区别,只是思维速度快了许多,基本上达到了过
目不忘的程度,对于数据化视野的处理能力也大为增强。直观点说,就是原本混乱复杂
的战场现在变得更加简单清晰,李察也能够在更短的时间明晰形势,从而下达更多的命
令。单位时间内,他可以下达的命令数量提升了一倍,也即是掌控战场的能力相应提升
一倍。
几百人规模的队伍对于目前的李察来说恰到好处,可以完全发挥他的能力。不过清
晰地知道和思索反应是一回事,能否得到准确的结论又是另一回事。决策是否正确,和
数字的处理能力没有太大的关系,智慧天赋的提升,只是让李察减少了因为仓促和思考
不周而犯错的机会。
可是即使如此,智慧的强大效果也已在战局中体现出来。四百多名战士已经完全适
应了李察的指挥,并且融为一个整体,哪怕是如刚刚发生的那场战斗中被强势敌军突袭
,也能够在最短的时间内解除混乱,调整好阵形,并且重新组成坚不可摧的战阵。
在李察手中,这支规模不大,原本是由各个种族、不同出身战士拼凑而成的部队,
现在已变得如同最精密的炼金机械,以不可思议的效率收割着敌人的生命。
在距离李察一百多公里之外,一列车队正行驶在荒凉的戈壁上。
是车队,但组成车队的不是普通商队的货车,而是几辆涂抹着猩红色涂装的载客马
车。居中一辆马车装饰低调而奢华,驱车的是高大战马,而马车的四轮处均附加了可以
减震的魔法机械,在魔力的作用下,通过最崎岖路面的时候甚至可以短时间飘浮。
即使忽略手工费,这辆马车本身的材料价值就是十万金币以上,用途当然不会仅仅
是为了提供长途旅行中的舒适度。实际上这是一辆魔法战车,功用就是在长途征战行军
的过程中提供足够安静平稳的环境,让魔法师们可以冥想恢复魔力。而且马车车厢内部
还布置专门的魔法阵,由魔力水晶驱动,可以加速魔法师冥想的过程。
在诺兰德,高阶法师们根本不需要这种战车,而大魔法师级别都只算是低阶的,他
们用不起,也没必要用到魔法战车。只有在法师身份地位非同一般的法罗位面,才会出
现这种装备。如果李察看到,以他源自深蓝的专业眼光,自然会看出这种所谓战车的意
义,更多是魔法师们炫耀自身地位财富的工具。
PS:加更2。信誉,嗯,信誉。
avatar
m*a
5
int i=1;
const int *const ptr=&i;
i=10;//*ptr=10
ptr指的不是const,还是不允许*ptr=10这样赋值
const不是常量的意思,而是不能赋值的意思
如果你有其他变量来改变这个值的话,没有问题
这和大家要的常量相差太大了
真个有点儿搞
avatar
D*y
6
同问,而且这种情况应该补填2014年的3520表还是2016年的?谢谢!

【在 L*********h 的大作中提到】
: 【 以下文字转载自 Money 讨论区 】
: 发信人: Leapoffaith (take a leap of faith), 信区: Money
: 标 题: Form 3520 foreign gift申报,以前该申报的没报怎么办?
: 发信站: BBS 未名空间站 (Wed Mar 8 18:29:45 2017, 美东)
: 比如2014该报的。没有报
: 有什么办法吗?

avatar
T*s
7
母巢能跟上么
到山区就好了
avatar
p*o
8
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不是常量的意思,而是不能赋值的意思
: 如果你有其他变量来改变这个值的话,没有问题
: 这和大家要的常量相差太大了
: 真个有点儿搞

avatar
m*a
9
既然可以用auto,那么就drop所有type,所有的东西都用auto
最好把auto也drop
即用没有type的语言就行了
avatar
m*a
10
这些“专家”设计出一坨屎出来
还更新版本,越新的版本越少的人用
还更新的屁
avatar
S*A
11
那是因为你没有明白 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不是常量的意思,而是不能赋值的意思
: 如果你有其他变量来改变这个值的话,没有问题
: 这和大家要的常量相差太大了
: 真个有点儿搞

avatar
b*s
12
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不是常量的意思,而是不能赋值的意思
: 如果你有其他变量来改变这个值的话,没有问题
: 这和大家要的常量相差太大了
: 真个有点儿搞

avatar
T*x
13
我觉得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不是常量的意思,而是不能赋值的意思
: 如果你有其他变量来改变这个值的话,没有问题
: 这和大家要的常量相差太大了
: 真个有点儿搞

avatar
S*A
14

那 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
: 语义是清楚的。

avatar
w*g
15
最左边的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是

avatar
S*A
16

这不是冗余的规则,其实是你不允许出现左边 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整体水平前几年下降非常快。

avatar
w*g
17
仔细想了一下。我的理解确实是片面的。但是规则应该没错。
所有最左边的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 的编译器是如何工作的,这些左边右边规则
: 是不需要记住的,你为了记这个不是规则的规则还要加个违反规则的特

avatar
w*g
18
不允许出现最左边的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之后还是保持语义不变。
: 我正在想反例,还没想出来。你给想个看看。

avatar
t*e
19
java final is a complete joke

【在 p***o 的大作中提到】
: Trust me, Java is a much better choice.
avatar
S*A
20
你举的例子很好啊。
所以理解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有关。

avatar
m*a
21
你说的东西,我是知道
但是是个人就是想要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 * 就是说,

相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。