一个很奇怪的问题, 关于if语句的

lyl0426 2011-10-07 05:00:56
代码如下:

if(!is_file_exist(&file_path))
{
.....
}
is_file_exist(&file_path)返回类型为BOOL
单步调试, if语句内条件明明成立,但是就是不进入代码块
而把is_file_exist()返回的值赋给一个BOOL型的变量,再用该变量作为if语句的条件,就ok了.

有谁碰到过类似问题并知道原因的么?
...全文
313 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
沭水河畔 2011-10-13
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 lyl0426 的回复:]

函数明明宏定义将TRUE定义为1, FALSE定义为0了, 但是使用if(is_file_exist(&file_path) == false)并不可行, 输出时值为0 没错. 但是使用if(is_file_exist(&file_path) != true)就可以了. 应该还是因为C没有BOOL类型造成的.
[/Quote]
沒有的話應該報錯的吧?
假設TRUE=1,FALSE=0,那麼“A!=true”和“A==false”是不一樣的,比如A為0、1以外的值。樓主再檢查一下邏輯。
lyl0426 2011-10-12
  • 打赏
  • 举报
回复
谢谢大家的回复.
lyl0426 2011-10-12
  • 打赏
  • 举报
回复
函数明明宏定义将TRUE定义为1, FALSE定义为0了, 但是使用if(is_file_exist(&file_path) == false)并不可行, 输出时值为0 没错. 但是使用if(is_file_exist(&file_path) != true)就可以了. 应该还是因为C没有BOOL类型造成的.
lyl0426 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 studycbc 的回复:]

1、is_file_exist(&file_path)函数返回的问题,都为真无法进入, 调用了全局变量被修改会分配的内存失败或被释放
2、编译器的问题,觉得这个可能性比较小
[/Quote]

is_file_exist()返回值我都单步调了,确认是返回FALSE的情况下也没有进入if语句块. 
个人也觉得应该不会是编译器的问题
lyl0426 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhao4zhong1 的回复:]

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

不要写连自己……
[/Quote]

谢谢,我会试着调一下.
lyl0426 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 hengshan 的回复:]

is_file_exist(&file_path)

估计是你这个函数返回值的问题,应该是整形吧?

注意c中没有bool型,是用整形来表示的,0表示false,非零表示true
[/Quote]

那就是说用取非符号其实是没有意义的了? 我有尝试用is_file_exist() == FLASE的判断语句, 我们程序里面FALSE的宏定义为0,TRUE定义为1而不是非0 .但是这个判断也无效
5t4rk 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 zhao4zhong1 的回复:]

VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

不要写连自己……
[/Quote]

高手来了++
lyl0426 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lishanchao 的回复:]

我覺得這個函數可能有問題:
is_file_exist(&file_path)
如果這個函數沒有問題,那麼參考這個帖子。帖子中樓主最終發現自己提前free掉了內存,導致野指針出現,所以表面看起來問題很詭異。
[/Quote]

这个函数有在其他地方用到, 都没有问题.
lyl0426 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 anyidan 的回复:]

请先确认函数的声明和函数定义正确,并且在此点可以看到函数的声明/定义
[/Quote]
这个可以确定无错.
lyl0426 2011-10-10
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 johnpher 的回复:]

可以在release下printf表达式is_file_exist(&file_path)的值,
或者清理工程重新编译再试试看,还不行就是编译环境的问题了。
[/Quote]

你说的方法都有试过, is_file_exist的值是false, 但是就是进不去if语句块
feidaosh 2011-10-10
  • 打赏
  • 举报
回复
在C里,你打不出BOOL类型的值的,什么FALSE、TRUE都是浮云,你只能打出一个整数,把这个整数打出来看看。要知道a==true,这个true可能是1,也可能是-1。。。
feidaosh 2011-10-10
  • 打赏
  • 举报
回复
你把is_file_exist的原型贴出来看一下。。。C里面并没有BOOL类型,你说你把is_file_exist的返回值给一个BOOL变量就能行,那么可以把这个返回值和这个BOOL变量的值全打出来看一下。
636f6c696e 2011-10-10
  • 打赏
  • 举报
回复
改成if(is_file_exist(&file_path) == false)
xinshirn 2011-10-10
  • 打赏
  • 举报
回复
在这个if语句前面加一句话
printf("%d\n",is_file_exist(&file_path));
试试呢?
七擒关羽 2011-10-08
  • 打赏
  • 举报
回复
1、is_file_exist(&file_path)函数返回的问题,都为真无法进入, 调用了全局变量被修改会分配的内存失败或被释放
2、编译器的问题,觉得这个可能性比较小
赵4老师 2011-10-08
  • 打赏
  • 举报
回复
VC调试(TC或BC用TD调试)时按Alt+8、Alt+6和Alt+5,打开汇编窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

不要写连自己也预测不了结果的代码!
hengshan 2011-10-08
  • 打赏
  • 举报
回复
is_file_exist(&file_path)

估计是你这个函数返回值的问题,应该是整形吧?

注意c中没有bool型,是用整形来表示的,0表示false,非零表示true
沭水河畔 2011-10-08
  • 打赏
  • 举报
回复
我覺得這個函數可能有問題:
is_file_exist(&file_path)
如果這個函數沒有問題,那麼參考這個帖子。帖子中樓主最終發現自己提前free掉了內存,導致野指針出現,所以表面看起來問題很詭異。
AnYidan 2011-10-07
  • 打赏
  • 举报
回复
[Quote=引用楼主 lyl0426 的回复:]
代码如下:

if(!is_file_exist(&file_path))
{
.....
}
is_file_exist(&file_path)返回类型为BOOL
单步调试, if语句内条件明明成立,但是就是不进入代码块
而把is_file_exist()返回的值赋给一个BOOL型的变量,再用该变量作为if语句的条件,就ok了.

有谁碰到过类似问题并知……
[/Quote]

请先确认函数的声明和函数定义正确,并且在此点可以看到函数的声明/定义
JiangXiang 2011-10-07
  • 打赏
  • 举报
回复
可以在release下printf表达式is_file_exist(&file_path)的值,
或者清理工程重新编译再试试看,还不行就是编译环境的问题了。
加载更多回复(7)

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧