C/C++ 代码中的额外空格和换行符会发生什么情况?

dex*_*ter 0 c c++

之间有区别吗;

int main(){
return 0;
}
Run Code Online (Sandbox Code Playgroud)

int main(){return 0;}
Run Code Online (Sandbox Code Playgroud)

int main(){
return
0;
}
Run Code Online (Sandbox Code Playgroud)

它们都可能编译为相同的可执行文件。C/C++ 编译器如何处理多余的空格和换行符,以及处理换行符的方式与 C 代码中空格的方式是否存在差异?

另外,标签怎么样?如果有的话,在代码中使用制表符而不是空格有何意义?

Hol*_*Cat 6

任何 1 个以上空白符号(空格/换行符/制表符/...)的序列都相当于一个空格。

例外情况:

  • 字符串文字中保留空格。它们不能包含换行符,C++ 原始文字 ( R"(...)") 除外。这同样适用于#include.
  • 单行注释 ( //) 仅以换行符结束。
  • 预处理器指令(以 开头#)仅以换行符终止。
  • \后面的换行符会删除两者,从而允许多行//注释、预处理器指令和字符串文字。

_此外,如果空白符号的左侧和/或右侧有标点符号(字母、数字和 除外),则空白符号将被忽略。例如1 + 21+2相同,但return a;returna;不同。

例外情况:

  • 显然,字符串文字中的空格不会被忽略。也不在#include文件名中。

  • 由 >1 个标点符号组成的运算符不能分开,例如cout < < 1是非法的。这同样适用于//和 等事物/* */

  • 标点符号之间可能需要一个空格,以防止其合并为单个运算符。例子:

    • + +a不同于++a.
    • a+++b相当于a++ +b,但不等于a+ ++b
    • 在 C++11 之前,连续关闭两个模板参数列表需要一个空格:std::vector<std::vector<int> >
  • 定义类似函数的宏时,左括号前不允许有空格(添加它会将其变成类似对象的宏)。例如,#define A()不替换A()任何内容,但#define A ()替换A().