0

我在 if 语句中看到的是这样的。

if((var = someFunc()) == 0){
   ...
}

会不会声明

(var = someFunc()) 

无论我们在什么环境中,总是返回 var 的最终值?

4

3 回答 3

4

这只是一种分配给变量并同时比较返回值的单行方式。

您需要在赋值两边加上括号,因为比较运算符的优先级高于赋值运算符,否则var将被赋值为someFunc() == 0.

于 2012-10-23T10:04:13.800 回答
1

这是完全错误的。var被赋值,然后它的值被一个常量覆盖0。函数的返回值因此丢失,并且if总是失败。如今,大多数编译器可能会对此发出警告,这既是因为 an 内的赋值,if也是因为不可能if导致结果。做可能打算做的事情的正确方法是

if((var = someFunc()) == 0) {

(请注意,这也可能是恶意代码试图以常见的新手错误为幌子引入漏洞。最近有一个案例有人试图将支票偷运到他们将 UID 分配为 0 的 Linux 内核中(即, root),同时假装检查自己是否是 root。但是没有用。)

于 2012-10-23T10:06:48.440 回答
0

这个是对的,我一直在用

if ((f=fopen(s,"r"))==NULL) return(fprintf(stderr,"fopen(%s,r) 失败, errno=%d, %s\n",s,errno,strerror (错误号)));/* 成功打开文件 s,从 FILE *f 中任意读取 */

我在 calloc() 内存时也使用它。

您正在将 someFunc (在我的情况下为 fopen 或 calloc )的返回值分配给一个变量并测试该返回值,这是一种语义快捷方式,假设您永远不想单独调试分配和测试。

于 2013-04-11T13:41:40.973 回答