在这个C代码中,表达式如何充当布尔值

Bah*_*dil 5 c

基本上我在下面的代码中有两个问题:

const char *x = "abc";
const char *y = "def";

char *res = (char*)malloc(0);
char *z = res;
while (*z++ = *x++);
z--; // remove \0
while (*z++ = *y++);

printf("%s\n", res); // output: abcdef
free(res);
Run Code Online (Sandbox Code Playgroud)

此代码的目的是在一个中添加两个字符串.但是这条线while (*z++ = *x++);如何起作用boolean 1/0,为什么我甚malloc(0);至将它设置为零它也运行良好没有任何问题?

小智 6

但是这条线while (*z++ = *x++);如何充当布尔值1/0

这是因为在C中,赋值是一个表达式,它的计算结果为赋值.当*x到达最终'\0'终止符时,它将计算到0,因此false在布尔上下文中.

由于错误输入,这是一个很好的错误来源:

if (x = 1) // always true, as a side effect assigns 1 to x
Run Code Online (Sandbox Code Playgroud)

为什么我甚至设置malloc(0);为零它也运行良好没有任何问题?

使用malloc(0)写入值的返回值是未定义的并且"意外地工作".您请求字节,因此永远不允许您写入此分配,malloc()甚至可以返回空指针.

引用自己的未定义行为:

未定义的行为 C

C是一种非常低级的语言,其结果如下:

什么都不会阻止你做一些完全错误的事情.

许多语言,尤其是对一些管理的环境JavaC#真正停止时,你做的事情,是不允许的,比如,访问不存在的数组元素.C没有.只要你的程序在语法上是正确的,编译器就不会抱怨.如果您在程序中执行了某些禁止操作,则C只需调用程序的行为未定义.这正式允许在运行程序时发生任何事情.通常,结果将是崩溃或仅输出"垃圾"值,如上所示.但是如果你真的不走运,那么你的程序似乎工作得很好,直到它得到一些稍微不同的输入,到那时,你将很难找到你的程序 未定义的地方.因此,一定要避免未定义的行为!.

另外,未定义的行为也会导致安全漏洞.这在实践中发生了很多.