C 条件的计算结果为true,而调试器说它应该为false
我在gdb中调试时遇到了一个奇怪的问题: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)
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+1