这种 if 语句的使用会导致未定义的行为吗?
Does this usage of if statements cause undefined behaviour?
我想知道条件语句(例如 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 语句(在更复杂的情况下),但我似乎每次都没有进入正确的语句。
请赐教有没有这方面的规定?
will I get undefined behaviour by not including all 3 variables into every condition?
每个条件不包含所有变量的行为本身并不是未定义的。
Will every unaccounted for condition go into the else statement?
语句-false(即关键字else
后的语句)如果条件为假则执行
what happens if I get rid of the else statement?
从 if 语句之后的语句继续执行。
不,您这里没有未定义的行为。听起来像是您没有条件(布尔)逻辑的准确心智模型。 else
始终是 if
语句的可选部分。
将执行 { ... }
个块中的一个 。更改其中任何一个中 x
、y
或 z
的值将不会导致执行任何其他值,决定是 first。
根据经验,是的,尝试读取未初始化的变量是个坏主意,因为这样做的行为通常是 undefined。但这里不是这种情况:所有变量都已初始化。
但是在 if(...)
条件下,您所需要的只是计算结果为 true
或 false
的东西。在这一点上,您的代码绝对没问题。我会使用 &&
和 ||
而不是 and
和 or
尽管前者更常见。
有关未定义的相当全面的构造集,请参阅 What are all the common undefined behaviours that a C++ programmer should know about?
我想知道条件语句(例如 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 语句(在更复杂的情况下),但我似乎每次都没有进入正确的语句。
请赐教有没有这方面的规定?
will I get undefined behaviour by not including all 3 variables into every condition?
每个条件不包含所有变量的行为本身并不是未定义的。
Will every unaccounted for condition go into the else statement?
语句-false(即关键字else
后的语句)如果条件为假则执行
what happens if I get rid of the else statement?
从 if 语句之后的语句继续执行。
不,您这里没有未定义的行为。听起来像是您没有条件(布尔)逻辑的准确心智模型。 else
始终是 if
语句的可选部分。
将执行 { ... }
个块中的一个 。更改其中任何一个中 x
、y
或 z
的值将不会导致执行任何其他值,决定是 first。
根据经验,是的,尝试读取未初始化的变量是个坏主意,因为这样做的行为通常是 undefined。但这里不是这种情况:所有变量都已初始化。
但是在 if(...)
条件下,您所需要的只是计算结果为 true
或 false
的东西。在这一点上,您的代码绝对没问题。我会使用 &&
和 ||
而不是 and
和 or
尽管前者更常见。
有关未定义的相当全面的构造集,请参阅 What are all the common undefined behaviours that a C++ programmer should know about?