Skip to main content

Some Points About C Programming: Every Programmer Should Know

Some important points in C Programming

Here I am writing some points about C programming which I acquired during my learning about programming. These points may help you to get more from the C language, and increase the curiosity to explore it wider.

      
1) You can not use return keyword in ternary operators(?,:)

2) You can't left the bracket empty of while and for loops
 like while() and for();

3) if i=5; then i=i+(6,7,8,2,9); will assign i=5+9;Because
 of ',' operator association.

4) You can only apply the register specifier to local
 variables and to the formal parameters in a function.

5) If You declared too many register variables then 
 compiler automatically transforms register variables
 into non register variables when the limit is reached.
   
6) You can't obtain the address of a register variable 
 by using the & operator.

7) Register variable only for int and char type.It may 
 support other types(not in Dev-C++5.3.0.4) but significant
 effect can be obtain only with integer and character types.

8) (L,U) for int,(L,F) for real are suffixes for constants 
 in C. You can use lowercase also (l,u,f) in place of
 uppercase.

9) (0x,0X,0) for (hex-lower,hex-upper,octa) are prefixes
 for constants in C.

10) '-' unary operator: expression -a is same as (-1)*a.

11) Operators on the same level of precedence are evaluated
 by the compiler from left to right.

12) Bitwise operation only work with the standard char and 
 int data types and variants.

13) Using sizeof operator with type You must have to use 
 parentheses while with variable it is not necessary.
 int a;  sizeof a;//Valid   sizeof int;//Not Valid

14) sizeof is evaluated at compile time and the value 
 returned by sizeof is of type size_t. size_t corresponds
 loosely to an unsigned integer.

15) Comma(,) Operator let a statement a=(ex1,ex2,ex3);
 Evaluation of this statement will be like following.
 a=ex1;
 a=ex2;
 a=ex3;
 finally value of ex3 will asign to a.

16) All operators, except the unary operators and '?'
 associate from left to right.

17) Casts (type) are technically unary operators.

18) Redundant or additional parentheses do not cause errors
 or slow down the execution of an expression.

19) The rand( ) function requires the header <stdlib.h>

20) C89 specifies that at least 15 levels of nesting must 
 be supported by the compiler. C99 raises this limit to 127.

21) 0?a=5:b=7; give error lvalue reqired but 0?a=5:(b=7); 
 does not give any error.

22) C89 specifies that a switch can have at most 257 case
 statements. C99 supports at most 1,023 case statements.

23) switch only work with int and char. The cases must not
 be redundent and variable, they must be unique constants.

24) In switch block the statement just after
 '{' and before a 'case' never will execute.

25) Label of goto is any valid label either before
 or after goto.

26) kbhit() is a function defined in <stdio.h>
 which return 0 until a key pressed after pressing a
 key it returns non-zero.

27) void exit(int return_code) defined in <stdlib.h>

28) C performs no bounds checking on arrays.

29) statement int* a,b,c; only declare a as integer pointer
 not all b and c, it is like int *a,b,c;

30) "%p" in printf() print the address of pointer taken.

 explicit cast is required to convert to or from a 
31) A void * pointer is called a generic pointer.No 
 void * pointer.(In C++ an explicit type cast is needed.)

32) Pointer operations are performed relative to the base
 type of the pointer. While it is technically permissible
 for a pointer to point to some other type of object,
 the pointer will still "think" that it is pointing to
 an object of its base type.

33) pointer operations are governed by the type of the 
 pointer, not the type of the object being pointed to.

34) You can only compare and substract operation
 on pointers. 

35) Pointer arithmetic can be faster than the standard
 array-indexing notation.

36) In a function prototype declaration type *a and
 type a[] are same.

37) Multiple indirection known as pointers to pointers.

38) Global and static local pointers are automatically
 initialized to null.if you want to initialize a pointer
 to null declare like this int *p=0;

39) Null is used because C guarantees that no object will
 exist at the null address.If you try to operate or access
 the value at null address it will give segmentation fault.

40) char *s="Hello"; works while int *a={3,4,5}; not.
 C compiler handle string constants by creating a string
 table and storing them in to that table. In which a  
 character pointer can directly point a string constant.

41) char *s="Hello"; then printf(s);
 is same as printf("%s",s);

42) Function pointer: A function has a physical location
 in memory that can be assigned to a pointer.You obtain 
 the address of a function by using the function's name
 without any parentheses or arguments like arrays.

43) Declare a function: int (*fun)(int a,int b);  For the
 declartion (*fun) style is necessary while calling the
 function in either style
 (*fun)() or fun() but (*fun) style is prefrred.

44) It is necessary to initialize a pointer before going
 to use it otherwise it may cause a very serious problem.

45) You cannot use goto to jump into the middle of another
 function.You cannot define a function within a function.
 This is why C is not technically a block-structured
 language.

46) Each command line argument must be separated by
 a space or a tab. Commas, semicolons, and the like are
 not considered separators.

47) Recursion is the process of defining something
 in terms of itself, and is sometimes called circular
 definition.

48) The only function that does not require a prototype
 is main( ) because it is the first function called
 when your program begins.

49) In C89 you can use prototype int fun();
 instead of int fun(type1,type2,.....);

50) For variable number of arguments you must end the
 declaration of its parameters using three periods like
 int fun(int a,..);
 Any function that uses a variable number of parameters
 must have at least one actual parameter.

51) inline is only a request to the compiler, and can be
 ignored.

52) The C language gives you five ways to create a custom
 data type structure,union,bit-field, enumeration
 and typedef.

53) A structure { struct tag{int a;} struct-variables; }
 Where either tag or structure-variables may be omitted,
 but not both.

54) When we initialize a block data structure and the 
 given initialize values are less than totla fields then
 remaining fields initialize withe zero automatically.

55) To pass a structure to a function using call by
 reference is efficient and recommended because using
 pointer, only address need to push in stack while passing
 vlaue of structre is big overhead to push the whole
 structure in stack.

56) unsigned a=5; signed b=3;is valid and considerd as int.

57) A bit-field must be a member of a structure or union.
 The type of a bitfield must be char,int, signed,
 or unsigned.

58) You cannot take the address of a bit-field. Bit-fields
 cannot be arrayed. 

59) You do not have to name each bit-field. This makes it
 easy to reach the bit you want, bypassing unused ones.
 unsigned : 4; is a valid statement.

60) In enum you can specify the value of one or more of the
 symbols by using an initializer,by following the symbol
 with an equal sign and an integer value. Symbols that
 appear after an initializer are assigned values greater
 than the preceding value.

61) You can use enum in switch-case control.

62) In C,you must precede a tag with the keyword struct,
 union,or enum when declaring objects. In C++, you don't
 need the keyword.

63) The size of a structure may be equal to or greater
 than the sum of the sizes of its members.

64) Using typedef The new name you define is in addition
 to, not a replacement for, the existing type name.

65) getchar( ) returns EOF if an error occurs.The EOF
 macro is defined in <stdio.h> and is
 often equal to -1

66) getch() and getche() are not defined by Standard C,the 
 prototypes for these functions may found in
 the <conio.h>

67) getch() does not echo the character to the screen while
 getche() does.

68) gets() return address where it store the string.

69) Format specifier %a-Hexadecimal output in the form
 0xh.hhhhp+d (C99 only).%i same as %d.%g-Uses %e or %f,
 whichever is shorter and truncate unnecessary zeroes.
 %n-something bhaukali i can't realize yet but use to
 perform dynamic formatting and The associated argument
 must be a pointer to an integer. This specifier causes
 the number of characters written
 (up to the point at which the %n is encountered) to be
 stored in that integer.

70) Format Modifiers-goes between the
 percent sign and the format code.
 
    I-Minimum Field Width- "%5d" print in atleast 5 char
 width and default padding is space otherwise
 you can use 0 as "%05d".

    II-Precision Specifier-"%.5" with float represent digit
 after decimal,with string represent maximum char to be
 printed in case of larger string end character will be
 truncated,with int represent minimum digit.

    III-By default, all output is right justified but you
 can reverse it by putting '-'
 just after '%' like "%-10d".

    IV- l for long and h for short. lc and ls can be used
 for wide char and string.L forlong double.

    V- # add prefix to constant and * replace with
 arguments like ("%x %#x\n", 10, 10);
 and("%*.*f", 10, 4, 1234.34);



71) C99 also includes %a, which reads
 a floating-point number.

72) scanf("%d%s",&a,s); if we give inpt 12jlh it will parse
 into 12 and "jlh" and scanf("%d",&a);if we give inpt 12jlh
 it will asign 12 to a and ignore rest of it.

73) Scanset- is a RegExp within [] reads untill char
 is found in RE. scanf("%d%[abcdefg]%s", &i, str, str2);
 for 123abcdxzx.

74) Format Modifiers for scanf-
    I- maximum field length-"%5s" truncate end characters
 if larger than 5 and truncated char store in next scanf.

    II- Suppressing Input * read a field but not to assign
 anyone.scanf("%d%*c%d", &x, &y); for input "10,12" then
 ',' will not assign to anyone.

75) C I/O system provides a level of abstraction between
 the programmer and the device. This abstraction is
 called a stream, and the actual device is called a file.

76) FOPEN_MAX defines an integer value that determines
 the number of files that may be open at any one time.

77) r+ will not create a file if it does not exist;
 however, w+ will. Further, if the file already exists,
 opening it with w+ destroys its contents;
 opening it with r+ does not.

78) The most I/O functions returns EOF if an error occurs.

79) putc() and fputc() are same, both exist only for
 compatibility concerned. putc() implemented as macro
 and recommended. Same with getc() and fgetc().

80) Use of feof() is recommended over checking EOF to
 return of getc().

81) fgets() reads a string until either a newline character
 is read or length–1 characters have been read.
 If a newline is read, it will be part of the string
 unlike the gets() function.

82) The rewind( ) function resets the file position
 indicator to the beginning of the file.

83) fwrite() use to write block of data, which is not
 human readble in notepad.

84) You should use random access only on binary files.
 Open text in binary mode.

85) fprintf( ) and fscanf( ) are the easiest way to write
 and read assorted data,they are not always the most
 efficient.

86) In C when a program starts execution, three streams
 are opened automatically stdin, stdout and stderr.

87) the console I/O functions are simply special
 versions of their parallel file functions.

88) Using freopen( ) to Redirect the Standard Streams.
 freopen("OUTPUT", "w", stdout);

89) All preprocessor directives begin with a # sign.
 Each preprocessing directive must be on its own line
 and not followed by semicolon.

90) A macro may be used as part of the definition
 of other macro names.

91) No text substitutions occur if the macro identifier is
 within a quoted.

92) You may continue the line by placing a backslash '\' at
 the end of the line.

93) The #error directive forces the compiler to
 stop compilation.
 #error error-message (error-message should not be in "").

94) for #include< > the file is searched for
 in a manner defined by the creator of the compiler
 and "" looked for in another implementation-defined
 manner.

95) Conditional Compilation Directives #if, #else, #elif,
 and #endif.The expression that follows the #if is
 evaluated at compile time.
 Therefore, it must contain only previously
 defined identifiers and constants.

96) C89 states that #ifs and #elifs may be nested at least
 8 levels. C99 states that at least 63 levels of
 nesting be allowed.

97) #ifdef and #ifndef (if defined and if not defined) for
 conditional compilation of macros.

98) Both #ifdef and #ifndef may use an #else or
 #elif and #endif statement.

99) The #undef directive removes a previously 
 defined definition.#undef macro-name.

100) defined is a unary operator which operate on macros and
 returns if macro is defined.#if defined DEBUG

) The #line directive changes the contents of
 _ _LINE_ _ (contain line number) and
 _ _FILE_ _(contain name of sourcefile).
 #line number "filename"

101) #pragma is an implementation-defined directive that
 allows various instructions to be given to the compiler.

102) The # operator called the stringize operator,
 turns the argument it precedes into a quoted string.

103) The ## operator, called the pasting operator,
 concatenates two tokens. a ## b results ab.

104) There must be no spaces between the
 asterisk and the slash /* comment */.
 Multiline comments may not be nested.
 A single-line comment can be nested within 
 a multiline comment.

105) Comments may be placed anywhere in a program,
 as long as they do not appear in the middle of a
 keyword or identifier.
 x=10+/* add the numbers */5; is valid.

106) Whenever sizeof use with variable length array the 
 sizeof evaluate at runtime instead of compile time.

107) You can use Type Qualifiers in an Array Declaration
 in C99 but only in function declartion.

108) Variable Argument Lists for macro:
 #define MyMax(. . .) max(__VA_ARGS__)

109) C99 allows you to specify an unsized array as the
 last member of a structure.The structure must have
 at least one other member prior to the
 flexible array member.

110) Designated Initializers:
 int a[10] = { [0] = 100, [3] = 200 }; 
 for struct and union use .member-name instead of indexs.

111) C99 defines __func__ which specifies the
 name (as a string literal) of the function
 in which __func__ occurs.

112) Max no. of arguments in function calls:
 31 in C89 and 127 in C99.

113) The output of the compiler is an object file,
 and the output of the linker is an executable file.

114) The C language is a context free language,
 not (context,sensitve or regular).

115) C language has 6 tokens:
 identifiers,keywords,constants,string literal,operator
 and seprators.

116) Activation record is a data structure that
 composes a call stack.

117) If there are statements like [ int *a; int *b=a; ]
 then in second statement the address of
 'a' assigned to 'b'.
 For example Declartion {int* a;} is more 
 coperhensive than {int *a}.

118) [int a; int *p=&a;] works while[int a; int *p; *p=&a;]
 gives segmentation fault.

119) Like [int a=5;] you can't use
 [int *a=5;//Segmentaion fault] Because in this line
 *a require a address and you gave a constant.

120) Comparison operator is faster than divison operator.

121) In math.h for natural log we use double log(double x);
 and log2 and log10 for base-2 & base-10 respectively. 

122) In command line argument the arguments argc and argv
 have 'c' as count and 'v' as vecotr.

123) ungetc(char,FILE*) used to put a charcter into stream.

124) Functions are decleared within header file.That is
 function prototype exist in header file,not the function
 bodies.They are defined in library(lib).

125) For dynamic memory allocation there are four functions
 decleared in stdlib.h and prototype of each function are
 below.
 1)void *calloc(size_t num, size_t size); it sets the
 value zero.
 2)void *malloc(size_t size); it contains grabage value.
 3)void *realloc(void *ptr, size_t size); It reallocates
 with different size on the given address.
 4)void free(void *ptr); It delets the allocated memory.
  

Note:-If you find any discrepancy in concept or typing error. Please suggest in the comment.


Comments

  1. Big billion day wale din big Billion post. :)

    ReplyDelete
    Replies
    1. Rat k 12 bazne aur big billion day start hone k intzar me likha gaya tha ye

      Delete

Post a Comment

Popular posts from this blog

com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server

If you are trying to connect Mongo DB Server and it insanely throwing following error. com.mongodb.MongoTimeoutException : Timed out after 1000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=192.168.1.10:27010, type=UNKNOWN, state=CONNECTING, exception={ com.mongodb.MongoSecurityException: Exception authenticating MongoCredential {mechanism=null, userName='user123', source='admin', password=<hidden>, mechanismProperties={}}}, caused by {com.mongodb.MongoCommandException: Command failed with error 18 : 'Authentication failed.' on server 192.168.1.10:27010 . The full response is { "ok" : 0.0, "code" : 18, "errmsg" : "Authentication failed." }}}] If you start looking the error content First you encounter with Timeout Exception which may mislead you. It is basically an authentication error. I...

How to Create a Namespace in Aerospike Database

                      T his post is about creating a namespace in Aerospike. I could not find any concrete method to create a namespace like create database in MySQL and MongoDB. So I am suggesting a way to create a namespace in Aerospike Database. Step-1: Locate config file aerospike.conf and open it in your favorite editor and make sure you have permission to modify the file. In my system the path of file /etc/aerospike/aerospike.conf (Default in Ubuntu). Here the content of the file. # Aerospike database configuration file. service { user root group root paxos-single-replica-limit 1 # Number of nodes where the replica pidfile /var/run/aerospike/asd.pid service-threads 4 transaction-queues 4 transaction-threads-per-queue 4 proto-fd-max 15000 } logging { # Log file must be an absolute path. file /var/log/aerospike/aerospike.log { context any info } } net...

java.lang.IllegalArgumentException: Could not instantiate implementation: org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager

If you are trying to get started with Janus Graph with Apache Cassandra. You may get the following error. Caused by: org.janusgraph.diskstorage.TemporaryBackendException: Temporary failure in storage backend at org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager.getCassandraPartitioner(CassandraThriftStoreManager.java:219) ~[janusgraph-cassandra-0.2.0.jar:na] at org.janusgraph.diskstorage.cassandra.thrift.CassandraThriftStoreManager.<init>(CassandraThriftStoreManager.java:198) ~[janusgraph-cassandra-0.2.0.jar:na] ... 48 common frames omitted Caused by: org.apache.thrift.transport.TTransportException: java.net.ConnectException: Connection refused (Connection refused) at org.apache.thrift.transport.TSocket.open(TSocket.java:187) ~[libthrift-0.9.2.jar:0.9.2] at org.apache.thrift.transport.TFramedTransport.open(TFramedTransport.java:81) ~[libthrift-0.9.2.jar:0.9.2] at org.janusgraph.diskstorage.cassandra.thrift.thriftpool.CTConnectionFactory.makeR...