作者iamstudent (stu)
看板C_and_CPP
标题Re: [问题] const问题
时间Wed Nov 9 00:11:36 2011
这边提一下c的变数宣告处理规则
当c看见一个变数宣告时
他的判断方式其实是由内往外的
下面有一个把变数宣告转换为英文的方法
参考自书籍 Expert C Programming Deep C Secrets, Peter Van Der Linder, page76
步骤1 发现一个变数,输出"xxx is "
步骤2 看右边有无"[...]"。 若有,输出字串"array of ",然後跳到步骤4
步骤3 按右边有无"(...)"。 若有,输出字串"function return "
步骤4 往左边看有无'('。 如果可以成对群组起来就丢掉,跳到步骤2
步骤5 看左边有无"const"。 如果有,就输出 "read only ",跳到步骤4
步骤6 看左边有无'*'。 如果有,输出 "pointer to ",跳到步骤4
步骤7 发现基本型态。直接输出该型别
这边demo一下
我不会改颜色
所以用上一行的底线来标记处理区域
____
char * const *(*next)(); 执行步骤1,输出"next is a ..."
_____
char * const *(* )(); 执行步骤2往右找,没发现中括号。不是array
步骤3,没发现右边有(...)。也不是function
______
char * const *(* )(); 开始往左找
步骤4、5也都比对失败
步骤6,左边有星号,所以输出变成
"next is a pointer to ..."
_______
char * const *( )() 步骤2 3比对失败
步骤4发现成对小括号,拿掉
_________
char * const * () 步骤2失败
步骤3,发现右边有()
输出变为 "next is a pointer to function return .."
_
char * const * 步骤2 3 4 5 都失败
步骤6发现左边有*
输出:"next is a pointer to function return pointer
to ..."
_____
char * const 步骤 5 发现有const
输出:"next is a pointer to function return pointer
to read-only ..."
_
char * 步骤6发现*
"next is a pointer of function return pointer
to read-only pointer to ..."
____
char 步骤7发现char
"next is a pointer of function return pointer
to read-only pointer to char."
-----------------------------------------------------------------------------
这边有一个习题
char *(*c[10])(int**p);
解读出来应该是
c is array[10] of pointer to function return pointer to char
-----------------------------------------------------------------------------
最简化的记法
如果不考虑array与function
只看最後面几个步骤的说明
const修饰指标的解读一律都是右边往左
所以
char * p; p is pointer to char.
const char * p; p is pointer to char read-only.
char const * p; p is pointer to read-only char. (和上面一样)
char * const p; p is const pointer to char.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.210.62
1F:→ loveme00835:你都说由右往左, 写成 char const 比较清楚 11/09 00:19
2F:→ loveme00835:其实写左边很容易让人乱掉, 还以为是修饰右边 11/09 00:20
3F:→ iamstudent:可能是因为const放左边比较接近英文吧,所以也很多人写 11/09 00:27
4F:→ iamstudent:const int xxx; 和 int const xxx; 好像前者较多? 11/09 00:28
5F:推 handsomepow:感谢i大说明 11/09 00:32
6F:→ mythnc:char * p; p is pointer to char 11/09 00:33
已经修正,其实本来是想要打char**p;的
7F:→ akasan:#1B_2w2Uj 看到const 就会想到tinlans这篇好文 11/09 00:46
※ 编辑: iamstudent 来自: 140.113.251.45 (11/09 01:19)
8F:→ loveme00835:我看了《C++ Templates》之後, 一律把const摆右边 11/09 01:26
9F:推 xatier:Deep C Secrets 那本有超多外星密技的! 11/09 02:40
11F:推 hilorrk:san大跟我想到同一篇神文XD 11/09 22:29
12F:推 xatier:F大的网站....\("▔□▔)/ 11/10 00:22
13F:推 Arton0306:推 看了这篇我才知道要怎麽解读一长串的宣告 11/10 23:23