我们可以在运算符周围使用或省略空格,在函数名称及其带括号的参数列表之间,在数组名称及其索引之间等,以使代码更具可读性。我理解这是一个偏好的问题。
我能想到的唯一不允许空白的地方是:
#include < stdio.h > // fatal error: stdio.h : No such file or directory
C中的其他上下文中哪些空格不能用于可读性?
答案 0 :(得分:5)
在大多数情况下,在单个令牌中添加空格会使程序无效或更改令牌的含义。一个明显的例子:"foo"
和" foo "
都是具有不同值的有效字符串文字,因为字符串文字是单个标记。将123456
更改为123 456
会将其从单个整数常量更改为两个整数常量,从而导致语法错误。
这种情况的例外涉及预处理器。
您已经提到了#include
指令。请注意:
#include "header.h"
"header.h"
在语法上不是字符串文字;在字符串文字有意义之前处理它。语法类似,但是例如标题名称中的\t
序列不必替换为制表符。
新行(它是一种空格形式)在预处理程序指令中很重要;你不能合法地写:
#ifdef
FOO
/* ... */
#endif
但允许除换行之外的空格:
# if SPACES_ARE_ALLOWED_HERE
#endif
还有一个案例,我可以想到预处理器令牌之间允许的空格,但它会改变含义。在类函数宏的定义中,引入参数列表的(
必须紧跟宏名称。这样:
#define TWICE(x) ((x) + (x))
将TWICE
定义为一个类似函数的宏,它接受一个参数。但是这个:
#define NOT_TWICE (x) ((x) + (x))
将NOT_TWICE
定义为普通的宏,没有可扩展为(x) ((x) + (x))
的参数。
此规则仅适用于宏定义;宏调用遵循常规规则,因此您可以编写TWICE(42)
或TWICE ( 42 )
。
答案 1 :(得分:2)
在词法令牌中,不允许使用空格以提高可读性(重要性)。即在一个标识符(foo bar
与foobar
)之内,在一个数字(123 456
不同于123456
)内,在一个字符串中(这是你的例子基本上) )或在运算符内(+ +
与++
不同,+ =
与+=
不同。在那些之间你可以添加尽可能多的空白区域,但是当你在这样的标记内添加空格时,你会将词法标记分成两个单独的标记(或者在字符串常量的情况下改变值),从而改变其含义你的代码。
在大多数情况下,添加了空格的代码要么与原始代码等效,要么会导致语法错误。但也有例外。例如:
return a +++ b;
与
相同return a ++ + b;
但不同于:
return a + ++ b;
答案 2 :(得分:0)
我记得你需要对类似函数的宏非常小心,就像在这样的虚拟例子中一样:
#include <stdio.h>
#define sum(x, y) ((x)+(y))
int main(void)
{
printf("%d\n", sum(2, 2));
return 0;
}
的
#define sum(x, y) ((x)+(y))
与说法不同:
#define sum (x, y) ((x)+(y))
后一个是类似对象的宏,它完全取代(x, y) ((x)+(y))
,即参数不被取代(因为它发生在类似函数的宏中)。