gpt4 book ai didi

c++ - 如何纠正对运算符优先级的错误假设以消除代码的副作用?

转载 作者:太空宇宙 更新时间:2023-11-04 00:48:43 25 4
gpt4 key购买 nike

在审查某人的代码时,我遇到了与下面的错误类似的情况,其中错误(基本上是一些糟糕的编程习惯)不是很直接可见。根据所使用的编译器,i/i++ 可能是 01

int foo(int n) {
printf("Foo is %d\n", n);
return (0);
}

int bar(int n) {
printf("Bar is %d\n", n);
return (0);
}

int main(int argc, char *argv[]) {

int x = 0;
int(*(my_array[3]))();
int i = 1;
int y = i/++i;

printf("\ni/++i = %d, ", y);

my_array[1] = foo;
my_array[2] = bar;
(my_array[++x])(++x);
}

因此,输出要么是Foo is 2,要么是Bar is 2

我的问题可能被认为过于宽泛,但我想知道:

  1. 为什么会发生这种情况/为什么编译器允许这样做?(我检查了几个编译器,根本没有警告)
  2. 我们如何纠正这种奇怪的行为?(例如,我工作的项目非常庞大;如果发生更糟糕的事情,例如堆利用,会发生什么情况/bss 溢出不一致的同步 也是编译器允许的?意识到这一点后,人们不会简单地在晚上睡个好觉。)
  3. 我知道市场上有许多编码风格书籍,但是另一个程序员将​​如何决定哪一本输出是最好的?(假设没有预期的输出 - Foo 是 2Bar 是 2 对使用代码的程序员没有任何意义)

最佳答案

i/++i 导致未定义的行为,my_array[++x](++x) 也是如此。

这不是运算符优先级或求值顺序问题;这是一个顺序问题。 (编码人员可能认为存在与优先级相对应的副作用序列,但实际上并没有)。参见 this thread以获得更详细的描述。

这种错误可以通过不使用递增或赋值运算符作为子表达式来避免,除非你真的确定你在做什么。在这些情况下:

int y = i / (i+1);
++i;

my_array[x+1](x+1);
x += 2;

或任何预期的内容。

编译器没有义务检测任何这些,尽管一些编译器无论如何都会这样做。最新版本的 gcc 应该对 i/++i 发出警告。如果您认为这还不够好,请考虑加入 gcc 开发团队 :)

周围有静态代码分析工具,它们将尝试更好地检测未定义的行为。

关于c++ - 如何纠正对运算符优先级的错误假设以消除代码的副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27558317/

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