【问题标题】:Does this usage of if statements cause undefined behaviour? [closed]if 语句的这种用法会导致未定义的行为吗? [关闭]
【发布时间】:2019-08-02 00:39:30
【问题描述】:

我想知道条件语句的正确用法,例如 if 语句以避免未定义的行为。让我们从一个例子开始:

uint8_t x = 0;
bool y = false;
bool z = false;

if ((x == 135) and !y and !z) {
    //do something
}
else if ((x == 135) and y) {
    x = 5;
    z = true;   
}
else if ((x == 5) and z) {
    x = 135;
    z = false;
}
else {
    //do something
}

现在,如果不将所有 3 个变量都包含在每个条件中,我会得到未定义的行为吗?每个未解释的条件都会进入 else 语句吗?如果是这样,如果我摆脱 else 语句会发生什么?我有完全相同的 if 语句(在更复杂的情况下),而且我似乎每次都没有进入正确的语句。

如果有这方面的规定,请赐教?

【问题讨论】:

  • 您不必在条件中包含任何变量。
  • 欢迎来到 Stack Overflow!听起来你可以使用good C++ book
  • “我会得到未定义的行为吗” 您可能会认为您可以在 C++ 中凭空获得 UB,但事实并非如此坏的。 :p
  • @Hypomania 关于你的咆哮(我回滚了)总共有 6 人对你的问题投了反对票。以此来判断一个大约有 900 万人的社区似乎有点苛刻。
  • 学习或对基础有误解绝对没有错,这是在学习一门新的编程语言时可以预料到的。问题是在 Stack Overflow 上提问时,我们无法真正向您解释所有这些,entire books written on C++ 做得更好,所以这里最好的计划是先解决这个问题,然后您的问题会受到更好的欢迎,因为我们实际上可以提供帮助并给出“不”之外的技术答案。

标签: c++ if-statement conditional language-lawyer undefined-behavior


【解决方案1】:

如果不将所有 3 个变量都包含在每个条件中,我会得到未定义的行为吗?

不将所有变量包含在每个条件中的行为本身并不是未定义的。

每个未解释的条件都会进入 else 语句吗?

Statement-false(即关键字else之后的语句)如果条件为假则执行。

如果我去掉 else 语句会发生什么?

从 if 语句之后的语句继续执行。

【讨论】:

  • 感谢您耐心地向我解释(与其他人不同)。
【解决方案2】:

根据经验,是的,尝试读取尚未初始化的变量是个坏主意,因为这样做的行为通常是未定义。但这里的情况并非如此:所有变量都已初始化。

但在if(...) 条件中,您所需要的只是评估为truefalse 的东西。在这一点上,您的代码绝对没问题。我会使用&&|| 而不是andor,因为前者更常见。

对于一组相当全面的未定义结构,请参阅What are all the common undefined behaviours that a C++ programmer should know about?

【讨论】:

  • 感谢您的回答,非常感谢。
【解决方案3】:

不,您在这里没有未定义的行为。听起来像是您没有条件(布尔)逻辑的准确心智模型。 else 始终是 if 语句的可选部分。

恰好有一个 { ... } 块将被执行。在其中任何一个中更改xyz 的值都不会导致任何其他的被执行,决定是首先

【讨论】:

    猜你喜欢
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-11
    • 2016-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多