-1

想象一下,我有以下一段 C 代码,其中 foo() 产生副作用并返回一个整数:

if(bar) {
    foo();
    return 0;
}

现在,假设我真的很喜欢让我的代码紧凑,可能会以读者为代价,我将其更改为:

if (bar)
    return foo() && 0;

我是否可以确定这两段代码会产生相同的行为,或者我是否会冒着调用 foo() 的风险,因为可能的编译器优化或类似的事情不会执行,因此不会产生预期的副作用?

注意:这不是关于哪一段代码更好的问题,而是这两段代码是否真的在所有情况下产生相同的行为。我认为大多数人(和我)都同意应该使用前一段代码。

4

3 回答 3

3

是的,这两个是一样的。 foo()将始终被调用(假设bar为真)。

于 2013-11-10T22:45:58.597 回答
1

你给的两种形式是等价的。C11 标准(草案 n1570)指出,

6.5.13 逻辑与运算符
...
语义

3 如果 && 运算符的两个操作数比较不等于 0,则 && 运算符将产生 1;
  否则,它产生 0。结果具有 int 类型。
4 与按位二进制 & 运算符不同,&& 运算符保证从左到右
  评估; 如果计算第二个操作数,则在
  第一个和第二个操作数的评估。如果第一个操作数比较
  等于 0,则不计算第二个操作数。

到目前为止,类似的语言出现在所有 C 标准中。

您可能应该更喜欢在此处使用逗号运算符 ( return foo(), 0;),因为:

  • 它更短(一个字符对运算符的两个字符,您可以在使用逗号时删除左边的空格字符,总共减少两个字符)。
  • 它为您提供了更大的灵活性,因为您可以返回非标量类型(例如结构),以及比 0 或 1 更广泛的整数范围。
  • 它更好地传达了意图:“放弃返回值foo()并返回其他东西(0)代替”。

foo()现在,如果您碰巧遇到了删除对foo().

于 2013-11-11T03:32:37.067 回答
1

为什么要在后者中混淆您的代码?

使用前者。

更容易阅读,即这更容易理解

if(bar) {
    foo();
    return 0;
}

或者除非遇到工作保障问题

于 2013-11-10T22:51:04.727 回答