问题描述
|
我了解这是基本内容的一部分,但我被卡住了:-(
有人可以帮帮我吗?
程序1:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int a=1,b=2,c;
c=(a+b)++;
}
为什么输出错误?需要左值吗?
程式2:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *p1=\"name\";
char *p2;
p2=(char*)malloc(20);
memset(p2,20);
while(*p2++=*p1++);
printf(\"%s\\n\",p2);
}
为什么输出为空字符串?如果我颠倒递增顺序,即::2ѭ,为什么左值误差会出现?
解决方法
对于第一个问题,
(a+b)++
表示“将“4ѭ的值增加1”。
但是,您不能递增a+b
,因为它不是变量。您期望在以下代码中发生什么?
int a = 1,b = 2;
printf(\"a = %d,b = %d,a+b = %d\\n\",a,b,a+b);
(a+b)++;
printf(\"a = %d,a+b);
显然应该打印第一个“ 7”
a = 1,b = 2,a + b = 3
但是第二个呢?
a =?,b =?,a + b = 4
如果我们增加总和,不清楚a或b应该是什么。
至于第二个问题,请记住,复制数据时要更改ѭ8,所以当您要求打印出它指向的内容时,它指向的是字符串的末尾,而不是字符串的末尾。开始。
进行字符串复制的一种更简单的方法是使用strcpy
,如下所示:
strcpy(p2,p1);
请注意,这仅是安全的,因为您知道p1
中字符串的大小不大于p2
中的大小。如果不确定字符串的大小(例如,如果从用户输入中获取字符串),则需要小心,如Wikipedia所述。
至于为什么while(++*p2=++*p1);
不起作用,而while(*p2++=*p1++);
却起作用:
Postfix-++
的优先级高于*
。这表示,17ѭ表示*(p2++)
。
所以
*(p2++) = something;
是相同的
*p2 = something;
p2 += 1;
同时,++*p2
表示++(*p2)
,或““8ѭ指向的任何数字,加一”。
同样,如果您说了话,您也会遇到问题:
int a = 5,*p2 = &a;
++*p2 = 10;
printf(\"a = %d\\n\",a);
您希望该打印什么?如果有的话,它应该显示9,因为您要告诉编译器“ 25”。
但是,您不能指望C编译器能够解决该方程式,因此,为了保持语言的简单高效,禁止这种事情。
, c=(a+b)++;
a+b
不是左值-您想如何向加法结果(右值)分配一些内容-++ /-运算符确实分配新值。
while(*p2++=*p1++);
您p2指向字符串末尾的\\0
。您需要在循环之前存储指向p2的原始地址:
char *p3 = p2;
while(*p2++=*p1++)
;
printf(\"%s\\n\",p3);
, c=(a+b)++;
++
运算符不适用于临时变量。 (a+b)
是临时的。
while(*p2++=*p1++);
您在这里增加p2
。循环之后,“ 8”不再指向最后一次“ 37”调用返回的存储块的开头。
, 如果您查看while循环:
while(* p2 ++ = * p1 ++);
请记住,如果表达式不为零,则在C中为\“ True \”,如果为零则为false。即使循环没有主体,控制流仍然是:
检查条件->正文中的执行语句->检查条件
在这里,“检查条件”表示“评估语句并查看其是否为非零”。
while循环继续运行,直到p1指向零为止,此时控制权传递给printf。
例如
int main()
{
int array1[] = {2,3,1,5};
int array2[20];
int * p2 = (int *)memset(array2,20*sizeof(int));
int * p1 = array1;
while(*p2++ = *p1++) {
printf(\"In while: p1 is %d\\n\",*p1);
}
printf(\"Out of while: %d\\n\",*p2);
return 0;
}
产量:
In while: p1 is 3
In while: p1 is 1
In while: p1 is 0
Out of while: 0