views:

200

answers:

6
FILE *fd;
if (fd=fopen(fileName,"r") == NULL)
{   
    printf("File failed to open");
    exit(1);
}

This is a code snippet. When I compile it with gcc, i get the following warning:-

warning: assignment makes pointer from integer without a cast

When I put fd=fopen(argv[2],"r") within brackets, the problem gets solved..

I am not able to understand where am i converting integer to pointer when the brackets are not put.

A: 

Have you

#include <stdio.h>

?

Without this the compiler assumes all functions return an int

Cheers, Dan

Dan Kendall
mark downs with no comments? Bad form ppl. Help me to learn from my error. Also note - it was a question, not an assertion.
Dan Kendall
+1  A: 

You need parenthesis around the assignment:

if ((fd=fopen(fileName,"r")) == NULL)
....
Richard Pennington
+4  A: 

The precedence of the equality operator is higher than the assignment operator. Just change your code to:

FILE *fd;
if ((fd=fopen(fileName,"r")) == NULL)
{   
    printf("File failed to open");
    exit(1);
}
AraK
+12  A: 

Due to operator precedence rules the condition is interpreted as fd=(fopen(fileName,"r") == NULL). The result of == is integer, fd is a pointer, thus the error message.

Consider the "extended" version of your code:

FILE *fd;
int ok;
fd = fopen(fileName, "r");
ok = fd == NULL;
// ...

Would you expect the last line to be interpreted as (ok = fd) == NULL, or ok = (fd == NULL)?

David Schmitt
This answer actually explains the warning.
Richard Pennington
+1  A: 

== has higher precedence than =, so it compares the result of fopen() to NULL, then assigns that to fd.

Ignacio Vazquez-Abrams
+1  A: 

== has a higher priority than =.

Mick Sharpe