cat*_*cat 5 c syntax lexical-analysis
我不太了解C,但我理解基础知识,据我所知:
int main() {
if (1 == 1) printf("Hello World!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和
int main() {
if (1 == 1)
printf("Hello World!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
和
int main() {
if (1 == 1) {
printf("Hello World!\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
都精确地在语法上是等价的.声明是真的; 字符串打印; 大括号(显然)是可选的.
有时,特别是在SO上,我看到如下内容:
int main() {
if (1 == 1)
printf("one is one\n");
printf("is this inside the if statement??/who kn0WS\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
通过CodeGolf赋予的权力,我被引导相信C是与空白无关的; 词法分析器将标记分解为它们的组成部分并剥离字符串外的空格.
(我的意思是,整个原因分号-上每个语句,事情是这样的解析器可以剥离\n,\t,文字空间,还知道每个语句结束吧?)
那么,如果要忽略空格,如何才能明确地解析前一段代码(或者有人可以提出一个更好的例子)?
如果C程序员想要用依赖于空白的Pythonic语法编写,他们为什么要编写C语言,为什么在C语言教学的地方教它可以写出像这样的词汇模糊(对我来说,程序员和计算机)这样的语句?
if (1 == 1)
printf("one is one\n");
printf("is this inside the if statement??/who kn0WS\n");
Run Code Online (Sandbox Code Playgroud)
第二printf()不应该执行里面的if语句.
原因是前一行以分号结束,分号表示要执行的if-block的结束.
(我的意思是,每个语句分号的全部原因是解析器可以删除\n,\ t,文字空格并且仍然知道每个语句的结束位置,对吧?)
那么,如果要忽略空格,如何才能明确地解析前一段代码(或者有人可以提出一个更好的例子)?
解析示例:
if (1 == 1)// if - (和) - 语句(或块)跟随,跳过所有空格
//没有{找到 - >单一陈述,扫描直到; (外部报价/评论)
printf("one is one\n");// ; 遇到了,if-block结束了
没有大括号,只有一个语句属于if-block.
但是,正如已经说过的那样,使用大括号是一个好习惯.如果稍后添加一个语句(printf()例如快速临时语句),它将始终位于块内.
特例:
int i = 0;
while(i++ < 10);
printf("%d", i);
Run Code Online (Sandbox Code Playgroud)
这里printf()只执行一次.标记; 在结束时while().
如果是空语句,最好使用:
while(i++ < 10)
;
Run Code Online (Sandbox Code Playgroud)
使意图明确(或者,作为替代方案,{}也可以使用空块).
在C中,if语句在真值表达式之后采用完全语句,而不管缩进.通常,为了清楚起见,此语句是缩进的,但C忽略缩进.在任何情况下,您的任何示例都没有任何含糊之处.
在C和许多其他语言中,含糊不清的是"悬空的其他".例如,假设您在第二个if语句else后面有一个嵌套语句.它可以分组为:
if (expr)
if (expr)
statement
else
statement
Run Code Online (Sandbox Code Playgroud)
或者它可以分组为:
if (expr)
if (expr)
statement
else
statement
Run Code Online (Sandbox Code Playgroud)
这两者之间的唯一区别是它们是如何缩进的,C忽略了.在这种情况下,通过使用第一种解释来解决歧义,即else语句绑定到最近的先前if语句.要实现第二种解释,需要花括号:
if (expr) {
if (expr)
statement
}
else
statement
Run Code Online (Sandbox Code Playgroud)
但是,即使在第一种情况下,包括花括号也是一个好主意,即使它们不是必需的:
if (expr) {
if (expr)
statement
else
statement
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |