【问题标题】:C++ logical statementsC++ 逻辑语句
【发布时间】:2016-03-10 00:15:57
【问题描述】:

我是 C++ 课程的评分员。由于缺乏实践,我在更高级的概念方面的技能总体上相当缺乏,所以我不熟悉语言的来龙去脉。我的问题是关于掷骰子的作业中有一段不寻常的代码块。

#include <iostream>

using namespace std;

int main()
{
   int numSims = numSims % 12 == 0 || numSims > 1000;
   //Other irrelevant code follows
}

我找不到任何说这是错误的语法。据我所知,当这种语句无法执行时,我不明白为什么学生会想要这样做。这里有比我想念的秘密吗?

【问题讨论】:

  • 说“无法执行”这个说法并不准确,但代码肯定是个bug。
  • 没有秘密,它的垃圾。也许他们的意思是bool stop = numsims ...
  • 这可能是一个试图变得聪明的学生,但没有考虑易读性和连贯性,因为整个语句将返回 1 或 0(真或假)。它是递归的事实也意味着它会导致未定义的行为。是时候给你的学生打几分了!

标签: c++ logical-operators


【解决方案1】:

这将在计算右侧的表达式时执行,但使用未初始化的 numSims 值。最后 numSims 会以 0 或 1 结束。

编辑

考虑到下面 cmets 中的所有讨论,这在技术上是未定义的行为,可能导致程序在某些硬件平台上崩溃。 (它也有可能但不太可能触发相量或反转中子流的极性 - 取决于您的硬件平台。)

在当今使用的许多系统上,程序将运行并且未定义的行为(尝试使用存储在未初始化的 numSims 变量中的不确定值)将导致 numSims 以一个 0 或 1。

【讨论】:

  • 第一位是对的,但是代码有未定义的行为。
  • @J... 我认为您不明白未定义行为的含义。这意味着你不能说任何关于运行程序的结果。任何事情都有可能发生。
  • 这是编译器术语中的未定义行为。使用未初始化的变量会导致 UB。在许多(或大多数)系统中,它可能会按照你说的做,但编译器律师说它可以做任何事情,包括重新格式化你的硬盘
  • @J... 从未初始化的变量中读取的是 UB。并不是说它有一个 numSims 有一个不确定的值,而是从它读取可能会导致任何与实现相关的结果。想象一下具有陷阱表示的实现,或任何其他在读取变量时都会产生信号的机制。这是允许的。最重要的是,假设您不会从未初始化的变量中读取数据,优化器可以做任何事情。
  • @juanchopanza 不,我认为你是对的。 Itanium 似乎是一个具体的平台示例,其中寄存器值可以包含未初始化/不确定的陷阱表示。 C 和 C++ 似乎都使用这些。 stackoverflow.com/a/23831247/327083 实际上,企业平台会实现完全踩 UB 的硬件......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-24
  • 1970-01-01
  • 2021-12-15
  • 2012-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多