printf("I am don");
"I am don" with a "\0" appended will be stored in some memory address say at 1000, and 1000 will be passed to printf function. printf prints all characters starting from 1000 till a '\0' and hence "I am don" will be printed.
printf("%s", I am don);
Here also "I am don" with "\0" appended will be stored at some memory address say 1000. "%s" with "\0" appended is another string literal stored at another address say 1020. Now, 1020 is passed to printf function and it prints all characters till "\0". When it encounters the format specifier "%s". it takes in the next argument - which is address 1000, and prints all characters from there till "\0". So, "I am don" will be printed.
So, the first one is better from performance point of view.