如果语句中的if语句在语法上是否明确无误?

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语言教学的地方教它可以写出像这样的词汇模糊(对我来说,程序员和计算机)这样的语句?

Dan*_*_ds 5

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)

使意图明确(或者,作为替代方案,{}也可以使用空块).

  • 是的 - 但最好使用牙套(俗话说 - 总是使用牙套,然后你永远不会被裤子夹住). (5认同)
  • 那么无括号的if-blocks可以包含最多一个语句? (4认同)

Tom*_*zes 5

在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)