C FAQS
Q: Which bit wise operator is suitable for putting on a particular bit in a
number?
Ans:The bitwise OR operator. In the following code snippet, the bit number
24 is turned ON:
some_int = some_int | KBit24;
Q:Does there exist any other function which can be used to convert an
integer or a float to a string?
Ans:Some implementations provide a nonstandard function called itoa(),
which converts an integer to string.
#include
char *itoa(int value, char *string, int radix);
DESCRIPTION
The itoa() function constructs a string representation of an integer.
PARAMETERS
value:
Is the integer to be converted to string representation.
string:
Points to the buffer that is to hold resulting string.
The resulting string may be as long as seventeen bytes.
radix:
Is the base of the number; must be in the range 2 - 36.
A portable solution exists. One can use sprintf():
char s[SOME_CONST];
int i = 10;
float f = 10.20;
sprintf ( s, “%d %f\n”, i, f );
Q:What are advantages and disadvantages of external storage class?
Ans:Advantages of external storage class
1)Persistent storage of a variable retains the latest value
2)The value is globally available
Disadvantages of external storage class
1)The storage for an external variable exists even when the variable is not
needed
2)The side effect may produce surprising output
3)Modification of the program is difficult
4)Generality of a program is affected
Q:What is a void pointer?
Ans:A void pointer is a C convention for a raw address. The compiler has
no idea what type of object a void Pointer really points to. If you write
int *ip;
ip points to an int. If you write
void *p;
p doesn’t point to a void!
In C and C++, any time you need a void pointer, you can use another pointer
type. For example, if you have a char*, you can pass it to a function that
expects a void*. You don’t even need to cast it. In C (but not in C++), you
can use a void* any time you need any kind of pointer, without casting. (In
C++, you need to cast it).
A void pointer is used for working with raw memory or for passing a pointer to
an unspecified type.
Some C code operates on raw memory. When C was first invented, character
pointers (char *) were used for that. Then people started getting confused
about when a character pointer was a string, when it was a character array,
and when it was raw memory.
Q:How can type-insensitive macros be created?
Ans:A type-insensitive macro is a macro that performs the same basic
operation on different data types.
This task can be accomplished by using the concatenation operator to create a
call to a type-sensitive function based on the parameter passed to the macro.
The following program provides an example:
#include
#define SORT(data_type) sort_ ## data_type
void sort_int(int** i);
void sort_long(long** l);
void sort_float(float** f);
void sort_string(char** s);
void main(void);
void main(void)
{
int** ip;
long** lp;
float** fp;
char** cp;
...
sort(int)(ip);
sort(long)(lp);
sort(float)(fp);
sort(char)(cp);
...
}
This program contains four functions to sort four different data types: int,
long, float, and string (notice that only the function prototypes are included
for brevity). A macro named SORT was created to take the data type passed to
the macro and combine it with the sort_ string to form a valid function call
that is appropriate for the data type being sorted. Thus, the string
sort(int)(ip);
translates into
sort_int(ip);
after being run through the preprocessor.
Q:When should a type cast not be used?
Ans:A type cast should not be used to override a const or volatile
declaration. Overriding these type modifiers can cause the program to fail to
run correctly.
A type cast should not be used to turn a pointer to one type of structure or
data type into another. In the rare events in which this action is beneficial,
using a union to hold the values makes the programmer’s intentions clearer.
Q:When is a switch statement better than multiple if statements?
Ans:A switch statement is generally best to use when you have more than
two conditional expressions based on a single variable of numeric type.
Q:What is storage class and what are storage variable ?
Ans:A storage class is an attribute that changes the behavior of a
variable. It controls the lifetime, scope and linkage.
There are five types of storage classes
1) auto
2) static
3) extern
4) register
5) typedef
Q:What is a static function?
Ans:A static function is a function whose scope is limited to the current
source file. Scope refers to the visibility of a function or variable. If the
function or variable is visible outside of the current source file, it is said
to have global, or external, scope. If the function or variable is not visible
outside of the current source file, it is said to have local, or static,
scope.
Q:How can I sort things that are too large to bring into memory?
Ans:A sorting program that sorts items that are on secondary storage (disk
or tape) rather than primary storage (memory) is called an external sort.
Exactly how to sort large data depends on what is meant by too large to fit in
memory. If the items to be sorted are themselves too large to fit in memory
(such as images), but there aren’t many items, you can keep in memory only the
sort key and a value indicating the data’s location on disk. After the
key/value pairs are sorted, the data is rearranged on disk into the correct
order. If too large to fit in memory means that there are too many items to
fit into memory at one time, the data can be sorted in groups that will fit
into memory, and then the resulting files can be merged. A sort such as a
radix sort can also be used as an external sort, by making each bucket in the
sort a file. Even the quick sort can be an external sort. The data can be
partitioned by writing it to two smaller files. When the partitions are small
enough to fit, they are sorted in memory and concatenated to form the sorted
file.