gpt4 book ai didi

c - 教程点的 "C mock tests"是否正确?

转载 作者:行者123 更新时间:2023-12-03 09:46:29 26 4
gpt4 key购买 nike

由于我已经编码 C 20 多年了,我认为是时候参加考试了!看看我是否学到了任何东西,或者我是否只是一些欺诈行为,向互联网上的初学者发布免费但不正确的建议。
这个站点(我没有附属)提供免费的 C 测试。 https://www.tutorialspoint.com/cprogramming/cprogramming_mock_test.htm .
我参加了测试 1,但以 50 分中的 34 分惨败!是这个吗?我必须放弃我的 C 程序员职业吗?这个 Tutorialspoint 站点及其测试有多好?
具体来说,我未能用测试预期的答案回答 Q7、Q9、Q10、Q14、Q16、Q17、Q19、Q21、Q27、Q28、Q31、Q32、Q33、Q35、Q38、Q46。这些问题的正确答案是什么?
此外,当我在符合标准的 C 编译器( gcc -std=c11 -pedantic-errors )上编译问题时,它们甚至都不会通过编译。这是为什么?我和/或我的编译器坏了吗?或者这个网站根本不是很好?

最佳答案

这个网站一点都不好。
题是为1999年撤回的旧版C语言写的。它允许你把main写成main()没有返回类型。这已经超过 20 年的 C 无效,所以这就是它不能编译的原因。您需要使用 -std=c90 进行编译.
尽管在 main() 之前在带有隐式 int 的旧 C90 中,操作系统将使用函数 main() 的返回值,因此如果没有这些示例中的 return 语句,这意味着未定义的行为 (C11 6.9.1/12)。
值得注意的是,整个测试也缺乏\nprintf ,这意味着 stdout直到程序结束才刷新。 C 保证它在程序终止时被刷新。
具体来说,这些问题也是不正确的:

  • Q7:没有一个答案可能是正确的。操作数 'A'255属于 int 类型,所以加法(假设 A=65)保证不会溢出,而是导致 65 + 255 = 320。这导致 int然后通过简单的赋值转换为 c 的类型这是 char .这又可能是有符号或无符号类型,具体取决于编译器。这会影响转换是按照 C11 6.3.1.3/2 进行明确定义还是按照 6.3.1.3/3 进行实现定义。一种可能的结果是 320 = 140h,被截断:40h = 64。这将打印字符 '@'在 Linux 的 gcc x86 编译器上。
  • Q9:该代码导致编译器错误,因为它违反了简单赋值规则 ( references ) 的约束。他们可能打算写 unsigned x = 5, *y=&x, *p = y+0;在这种情况下,结果是未指定的 - 不能保证表达式 *y=&x在表达式 *p = y+0 之前计算.参见 C11 6.7.9/23:

    The evaluations of the initialization list expressions are indeterminately sequenced withrespect to one another and thus the order in which any side effects occur isunspecified.


    所以无论你怎么说,整个问题从根本上都是错误的。
  • Q10:关于是否对malloc的结果进行强制转换可能会引起很多风格问题。 .但除此之外,假设 #include <stdlib.h>存在,代码没问题。如果包含不存在(如问题中所示),则代码已损坏并且任何事情都可能发生。
  • Q14:这是一个无限循环,无限打印“Hello”。它不打印“无限循环”。
  • 问题 16:参见问题 14。此外,一个不错的编译器(例如 gcc -Wall )可能会在此处抛出一些诊断消息,因此回答“编译错误”不一定是错误的。取决于编译器设置。
  • Q17:假设计算机是 2 的补码,那么 -2。理论上,它可以打印 -1 或 -2 或 -(大数),具体取决于计算机是使用补码、补码还是有符号幅度。
  • Q19:正确答案是编译器错误。再次因为简单分配的限制。
  • Q21:假设 65'A' 的符号表值,然后它可以打印 'A' (little endian) 或 0 对应的符号(大端)。后者很可能看起来像“垃圾”。
  • Q27: 正确答案是无效使用 strcmp 函数,因为 #include <string.h>不见了。否则它会打印 0。
  • Q28:编译错误。有趣的是,测试是不一致的。在这里它突然不允许从整数到指针的隐式转换,它早先愉快地(并且错误地)允许的。
  • Q31:B 或 C 甚至 D。这取决于 int 的大小,几乎可以肯定是 2 或 4。但是,编译器可以自由地在 union 的末尾添加填充,因此它不妨打印一个更大的数字。
  • 问题 32:正确答案确实依赖于编译器,但是...为什么哦,为什么它在问题 31 中不依赖于编译器呢?
  • Q33:C 允许我们写 short , short intint short - 都是等价的,所以这个问题没有多大意义。
  • Q35:没有输出,因为代码没有编译。
  • Q38:输出是 7,而不是 6。
  • Q46:仅分配了 union 的 char 成员,其余部分包含不确定值。 union 成员 x 被声明为具有自动存储持续时间并且从不获取其地址,因此访问它是未定义的行为。 https://stackoverflow.com/a/40674888/584518
    如果不是这样,它会尝试打印一些不确定的值(“垃圾”)甚至 65 或 0,具体取决于 CPU 字节序。
  • 关于c - 教程点的 "C mock tests"是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62816217/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com