C 语言指针声明太混乱了啊!!!

int p1;
int
p2;
int * p3;
竟然都是声明了指向 int 的指针!
魂淡!你就不能规定严格一点吗?这样很容易引起误解的好吧。
int* p4,p5;
人家还以为 p4, p5 都是指针呢!

send from my openSUSE

ps 突然发现标题写错了, 改一改

所以在《C 和指针》里作者建议声明为

int p 而不是 int p

虽然似乎后者也很好的解释。* 是取值符号,两者都可以解释。但 int* x, y 会让人误解。

另外,C 语言词法解释是这样的:贪心法,每个符合应该包含更多字符。比如 x+++y 这样的语句会被理解成 x++ +y 而不是 x+ ++y,是因为 x++ 在 c 里是合法的,可解释的且它在前面,它就会优先这样解释。对空格 C 除了在

具体可以看看《c 语言解惑》《c 缺陷与陷阱》,我学到后来发现 c 遵守的规则其实很少,远比我初学时以为的少。比如它严格说没有赋值语句,所有的语句都是表达式。赋值语句也有返回值。故可以使用这样的语句。

x=(x=y+16)

又比如它没有字符型。而字符串加上双引号就是指针了。a[3][3] 里 a[3] 其实也可以说是指针," 指针常量"。

回楼上,我记得是这样的,C 语言或者说编译器神马的,分析代码的时候,从左到右读取,还用的是贪婪法,他会尽可能多的读取字符直到不能配起来,比如 a+++b,它读到第一个 + 的时候并不会马上认为这就是个 +,他会继续读下一个字符,诶,发现又是一个 +,可以凑成 ++ 呀,他就这样凑了,如果是其他的,比如数字,这时候他才认为刚才那个 + 真是个 +!。。。不过我最看不顺眼的是,C Primer Plus 推荐声明的时候用 int * p,使用的时候却用 *p,风格不统一我看不顺眼啊

send from my openSUSE

是的,我表述不好,就是这个意思。

这个最好就是 int *x 这种吧,没有歧义,用的时候就是 *x。x 是指针,*x 是指针的值,值的类型是 int。蛮清楚的。

当初我自己纠结 int *x, y 这个问题,后来发现逗号也是运算符。。。。。。

int*x 也是可以的哦 :slight_smile:

写代码和读代码的时候都时刻想着空格会被编译器无视就好多了…

五楼,这个也太坑爹了吧!我回去试试看!
六楼,有的空格还是有用的吧

send from my openSUSE

基本上除了字符串里面的空格,别的都是给人看的吧,我记得 C 语言编译的第一步就是把空格全部去掉,虽然编译器可能对具体情况会有更灵活的处理来方便报错一类的… 如果错了欢迎指正…

简单搜了一下,情况比我之前理解的要复杂一点 cnblogs.com/volcanol/archive/2011/06/04/2072400.html
不过对于 int* p 还是 int *p 这样的情况人肉无视空格来帮助理解还是可行的。

九楼,你在开玩笑吗?好吧,那个博客也说了他是新手…我觉得他说的没有说服力诶。我觉得,他说的 += 中间不能加空格,这不对吧?

send from my openSUSE

什么乱七八糟的 >_<

简单地说,就是(在 C 语言中,不包括预处理部分)两个连续的 token,如果连接在一起会变成一个 token 的话,那么中间要至少一个空白字符。
token 就是其词法分析的单位,比如标识符,比如运算符,比如字面常量。比如 int 和 ,放在一起还是分开无所谓,因为 C 语言中 int 不是一个 token。但是 int i 如果放在一起变成 inti 就成了一个 token。+= 是一个 token,如果拆开变成 + = 就变成了两个 token。如果是 “Hello World”,你写成 “Hello World” 就是另外一个 token 了。

附注:空白字符,没记错的话,包括普通空格、Tab、换行等。

拜谢楼上…

亲测,+= 真的不能分开诶。好吧。越来越混乱了,现在没时间纠结这个。我还是先出门准备面试吧。

我觉得 11 楼靠谱…

话说楼主是不是才刚开始学 C 呀?!

我觉得刚开始学习 C 是不会注意到这种细节的。我是开始复习 C 语言