《码出高效》学习笔记与书中错误记录

  • 时间:
  • 浏览:1

至于为哪几种 C 就不行呢?难道 C 的语法哪几种地方说了这是不合法的吗?闻所未闻啊?

C,不管是 ANSI C 还是 C99,都无法通过编译,直接给出 Error。

先来看 C,测试环境是 CentOS 7.3 x64,GCC 版本是 gcc version 4.8.5 203000623 (Red Hat 4.8.5-28) (GCC)。

今天在阅读《码出高效》的很久就看了两个 问题图片,我也是第一次知道,怎么让有点痛 颠覆我的认知。统统有做了怎么让 测试,并记录下来。

C++。

统统有,现在的问题图片的答案就很显然了,C 要求 if 后面 是第二根说说,然而文章一很久日后日后开使那种写法,是 Declaration,都不 Statement,统统有语法怎么让错的。

怎么让既然 C 的编译器说不行,那肯定是 C 的哪个标准说了这是不合法的,由于这是真的,这么 就都不 作用域的问题图片,怎么让语法、文法的问题图片。

再来看 Java。

我相信,CLion 等 IDE 都不 一样的结果,由于这么 ,这么 由于是 IDE 帮忙优化了,毕竟怎么让 很久,写 C 代码漏 include 怎么让 头文件,编译和运行的结果也是正确的(IDE 帮你自动补上了)。

结果是,编译通过,给出 Warning。

问题图片是怎么让的:

由于换成大括号,这么 还里能通过编译,遇到这么人 常见的 Warning。

这三句话,能通过编译吗,由于能,会给出 Warning 吗,由于这么 ,这么 错误信息是哪几种。

我做了怎么让 测试,发现事情好像并都不 这么 简单。

首先来澄清两个 概念,if 条件句后面 ,还要跟两个 说说。

统统有,怎么让 gcc 的编译器,都不 由于可不还要,怎么让从我的测试情况汇报来看,MinGW、Cygwin、Windows、Window 的 Ubuntu 子系统、CentOS 下,gcc 都不 给出 error。

书中给出的答案是,这么 通过编译,会给出 Declaration not allowed here 编译错误信息,并对此,书中解释为:

error: expected expression before ‘int’

强行运行,编译失败,无法运行。

单说说在这么 加大括号的情况汇报下,声明的变量不由于再被使用,编译器认为这么 任何意义。

这是两个 Declaration,而我还要两个 Statement,统统有 Declaration 在这里是不被允许的

由于是 Eclipse,直接给出错误。

我一很久日后日后开使也是怎么让认为的。我怎么让以为,为宜应该通过编译,最多是给两个 Warning 说 variable is never used

由于是 IDEA,会给出编译错误信息。

{int x;} 由于 {int x = 10;} 由于有了 {},是第二根说说,Statement。

I guess the counter-intuitive part of the question is: if this is correct C:

if (a == 1) { int b = 10;}

then why is this not also correct C?

if (a == 1) int b = 10;

I mean, a one-line conditional if statement should be fine either with or without braces, right?

The answer lies in the grammar of the if statement, as defined by the C standard. The relevant parts of the grammar I’ve quoted below. > Succinctly: the int b = 10 line is a declaration, not a statement, and the grammar for the if statement requires a statement after the conditional that it’s testing. But if you enclose the declaration in braces, it becomes a statement and everything’s well.

见: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf 以及 https://www.quora.com/What-does-error-expected-expression-before-int-mean-in-C

至于为哪几种 g++ 就可不还要,我你会你这些 问题图片,由于和 为哪几种怎么让 IDE 这么 写就可不还要通过编译,我猜想的是(是的,怎么让猜想,这么 验证过),恐怕是你这些 编译器,包括绝大多数的 IDE,都自动优化了你这些 地方,把所有的 if 等说说后面 ,默认当作套上了大括号在正确处理,即使是单说说,也假装有了两个 大括号作用域,怎么让再编译的。

由于稍后分析,下面继续测试。

然而测试的结果发现,好像事实过多如书中说的这么 简单。

同样的结果在环境中(我测试环境是 CodeBlocks,Windows)得到了相同的结果。

warning: unused variable ‘x’ [-Wunused-variable]

Declaration not allowed here

这也印证了那句 Error:expected expression,我还要两个 表达式。

换句话说,由于 if (true) {int x;} 是合法的,那为哪几种 if (true) int x; 就不符合语法呢?

Every declaration that introduces a name has a scope, in which they can be used.

我比较好奇,除了 Java,怎么让 语言会不让有同样的编译错误。

这是 3 个全部不同的概念,也是绝大多数多多程序 员从一很久日后日后开使就分不清的,怎么让也始终分不清,从来分不清。

首先是是测试 C、C++、Java 是都不 都对这句话有相同的结果。

int x 是两个 声明,Declaration。

int x = 10; 是两个 定义,Definition。

事实上与代码无关,即使是对刚才的 .c 文件,只要使用 g++ 编译器,也是通过的。

并肩,这与 Eclipse 的报错信息是一致的——if 后面 还要两个 Statement。( Statement expected after this token at … )

由于从你这些 深度图考虑,这么 ,IDEA 的错误提示,Declaration not allowed 就不应该从变量作用域的深度图考虑这里的变量声明不合法,怎么让应该理解成,这是两个 Declaration,而我还要两个 Statement,统统有 Declaration 在这里是不被允许的。

Unresolved compilation problem: Syntax error on token “)”, Statement expected after this token at …

我查阅了统统有资料(链接见文末),最后找到两个 比较信服的答案——都不 很久,根据 C 标准,这怎么让错的,彻底的语法错误。

表达式 Expression,显然是一句说说 Statement。