There is a serious flaw in your concept. When you run your program, the output is --> hello"ceans" & not helloceans.
When we use a preprocessor directive like this one #define A a, every occurrence of 'A' is replaced with 'a' during preprocessing.
The significance of # before the parameter is that when preprocessing occurs, it is expanded into a quoted string with the parameter replaced by actual argument.
Try a simple example,
#include<stdio.h>
#define print(s2) printf(#s2)
void main()
{
print(hi);
}
It will print hi as print(hi) is preprocessed as printf("hi"). Similarly, delhi("hello","ceans") becomes "hello"""ceans"". The third & forth double quote gets nullified. Now, the combined expression is sh[]="hello"ceans"" that's why the output is hello"ceans".
In case of ##, the situation is completely different. In this case the parameters are simply concatenated.
Try this,
#include<stdio.h>
#define F(a,b) a##b
void main()
{
int x =2,xy=4;
printf("%d",F(x,y));
}
The output will clarify the role of ##.