C 条件的计算结果为true,而调试器说它应该为false

C 条件的计算结果为true,而调试器说它应该为false,c,debugging,gdb,C,Debugging,Gdb,我在gdb中调试时遇到了一个奇怪的问题: (gdb) 107 newIterationRequired = infoAvailableUntil+1 < sqrt(input)+1 && isPrime ? TRUE : FALSE; (gdb) 107 newIterationRequired = infoAvailableUntil+1 < sqrt(input)+1 &&

我在gdb中调试时遇到了一个奇怪的问题:

(gdb) 
107                     newIterationRequired = infoAvailableUntil+1 < sqrt(input)+1 && isPrime ? TRUE : FALSE;
(gdb) 
107                     newIterationRequired = infoAvailableUntil+1 < sqrt(input)+1 && isPrime ? TRUE : FALSE;
(gdb) print infoAvailableUntil+1 < sqrt(input)+1 && isPrime ? TRUE : FALSE
$11 = FALSE
(gdb) s
108                     if (newIterationRequired)
(gdb) print newIterationRequired
$13 = TRUE

这怎么可能呢?

在这种情况下,我不会依赖您或gdb对运算符优先级的了解。尝试添加几个括号,以确保您、编译器和gdb实际看到的是相同的内容

newIterationRequired = ( ( infoAvailableUntil + 1 ) < ( sqrt( input ) + 1 ) ) && isPrime
哦,还有一个提示:看看

编辑1:你的评论说这并没有解决你的问题

那么,把这个复杂语句分为几个子语句。将InfoAvailableUtil+1存储到临时变量中。将sqrt输入+1存储到另一个临时变量中。从这些临时文件中编写newIterationRequired。在GDB内部,检查代码、您和GDB是否都同意每个中间步骤的结果

这是。找出给你带来麻烦的陈述,降低其复杂性,直到你发现错误或可以提出非常精确的问题


就我个人而言,我的下一个最好的怀疑是,当你说sqrt时,你的代码和gdb看到了不同的东西。

在这种情况下,我不会依赖你或gdb对运算符优先级的了解。尝试添加几个括号,以确保您、编译器和gdb实际看到的是相同的内容

newIterationRequired = ( ( infoAvailableUntil + 1 ) < ( sqrt( input ) + 1 ) ) && isPrime
哦,还有一个提示:看看

编辑1:你的评论说这并没有解决你的问题

那么,把这个复杂语句分为几个子语句。将InfoAvailableUtil+1存储到临时变量中。将sqrt输入+1存储到另一个临时变量中。从这些临时文件中编写newIterationRequired。在GDB内部,检查代码、您和GDB是否都同意每个中间步骤的结果

这是。找出给你带来麻烦的陈述,降低其复杂性,直到你发现错误或可以提出非常精确的问题


就我个人而言,我的下一个最好的怀疑是,当你说sqrt时,你的代码和gdb看到了不同的东西。

除非你用-O0编译,否则你不能确定单步执行一行接着一行的源代码。可能在请求表达式求值时,所有参数尚未完成,因此结果不可靠


另一种解释是,表达式的某些参数在活动寄存器中不再存在,因此gdb被愚弄了,并执行了错误的计算。

除非使用-O0编译,否则无法确定单步执行是否一行接一行地运行源代码。可能在请求表达式求值时,所有参数尚未完成,因此结果不可靠


另一种解释是,表达式的某些参数在活动寄存器中不再存在,因此gdb被愚弄了,并进行了错误的计算。

gdb没有正确计算sqrt,如图所示:

gdb没有正确计算sqrt,如图所示:

可读性建议:值=条件?真:假;与值=条件相同;假设TRUE为1,FALSE为0,它们都是。这是在多线程环境中运行的吗?您确定没有跳过可能会更改newIterationRequired值的指令吗?也许C中的优先级不同于gdb?是的,我的程序使用多个线程。然而,上面显示的第107行上的所有变量都是局部变量,所以我不会预测任何同步问题。我说的是newIterationRequired、InfoAvailableUtil、input和iPrime。可读性建议:值=条件?真:假;与值=条件相同;假设TRUE为1,FALSE为0,它们都是。这是在多线程环境中运行的吗?您确定没有跳过可能会更改newIterationRequired值的指令吗?也许C中的优先级不同于gdb?是的,我的程序使用多个线程。然而,上面显示的第107行上的所有变量都是局部变量,所以我不会预测任何同步问题。我说的是newIterationRequired、infoAvailableUntil、input和iPrime。运算符优先级也是我的第一个想法。我把它改为newIterationRequired=infoAvailableUntil+1les确实给了我一个正确的结果:这怎么可能?你确定C代码和GDB在调用sqrt时看到了相同的东西吗?在任何一种情况下,b1都不应该这样改变值。但是,您要么没有遵循我的链接,要么没有听从它的建议:我们仍然无法在本地重现您的问题,我们仍然只能猜测,因为您没有隔离问题。+1提到了使用-O0代码以外的任何代码进行步骤调试的相对价值。我认为-O0是理所当然的,但你永远不知道……在编译时,我确实使用了-O0作为gcc的参数。Eclipse的编译输出表明确实如此。您能检查每个变量是否都包含您期望的值吗?我对gdb的答案有点困惑,它显然能够计算sqrt。我真想知道它是怎么做到的。。。或者它不返回0,而不是。。。比如说3,在这种情况下,整个表达式被简化为2,你应该提到。。。我对GDB将sqrt3评估为0有一个稍微相关的问题+1提到使用-O0代码以外的任何其他代码进行步骤调试的相对价值。我认为-O0是理所当然的,但你永远不知道……在编译时,我确实使用了-O0作为gcc的参数。Eclipse的编译输出表明确实如此。您能检查每个变量是否都包含您期望的值吗?我对gdb的答案有点困惑,它显然能够计算sqrt。我真想知道它是怎么做到的。。。或者它不返回0,而不是。。。比如说3,在这种情况下,整个表达式被简化为2,你应该提到。。。我对GDB将sqrt3评估为0有一个稍微相关的问题。这很可能是正确的答案。希望@pieter会接受它。打印信息可用,直到+1<\uu sqrtinput+1&&iPrime起作用。标记为已接受。这很可能是正确答案。希望@pieter会接受它。打印信息可用,直到+1<\uu sqrtinput+1&&iPrime起作用。标记为已接受。