1

我知道这是基本内容的一部分,但我被困住了:-(有人可以帮我吗?

方案一:

#include <stdio.h>
#include <stdlib.h> 

int main()
{
 int a=1,b=2,c;
 c=(a+b)++;
}

为什么输出错误?需要左值吗?

方案二:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
 char *p1="name";
 char *p2;

 p2=(char*)malloc(20);
 memset(p2,0,20);

 while(*p2++=*p1++);
 printf("%s\n",p2);

}

为什么输出是空字符串?如果我颠倒递增的顺序,即:while(++*p2=++*p1);,为什么会出现左值错误?

4

4 回答 4

8

对于第一个问题,(a+b)++表示“将值增加a+b1”。

但是,您不能 increment 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, b = %d, a+b = %d\n", a, b, a+b);

显然第一个printf应该打印

a = 1, b = 2, a+b = 3

但是第二个呢?

a = ?, b = ?, a+b = 4

如果我们增加总和,不清楚 a 或 b 应该是什么。

至于第二个问题,请记住您在p2复制数据时正在更改,因此当您要求打印出它所指向的内容时,它指向的是字符串的末尾,而不是开头。

进行字符串复制的一种更简单的方法是使用strcpy,如下所示:

strcpy(p2, p1);

请注意,这只是安全的,因为您知道 in 字符串的p1大小不大于p2. 如果您不确定字符串的大小(例如,如果您从用户输入中获取字符串),则需要小心,如 Wikipedia 中所述

至于为什么while(++*p2=++*p1);不起作用,while 起作用while(*p2++=*p1++);

Postfix-++的优先级高于*. 这意味着,*p2++意味着*(p2++)。所以

*(p2++) = something;

是相同的

*p2 = something;
p2 += 1;

同时,++*p2表示++(*p2),或“无论p2指向什么,加一”。

同样,如果您说:

 int a = 5, *p2 = &a;
 ++*p2 = 10;
 printf("a = %d\n", a);

你希望这会打印什么?如果有的话,它应该打印 9,因为你告诉编译器*p2+1 = 10.

但是,您不能指望 C 编译器解决该等式,因此为了保持语言的简单和高效,这种事情是被禁止的。

于 2011-05-30T07:10:38.980 回答
2
c=(a+b)++;

a+b不是左值 - 你想如何为加法的结果(右值)分配一些东西 - 并且 ++/-- 运算符确实分配了新值。

while(*p2++=*p1++);

您 p2 指向\0字符串末尾的 。您需要在循环之前存储 p2 指向的原始地址:

char *p3 = p2;
while(*p2++=*p1++)
    ;
printf("%s\n",p3);
于 2011-05-30T07:08:52.693 回答
1

如果您查看 while 循环:

而(*p2++ = *p1++);

请记住,如果表达式不为零,则表达式在 C 中为“真”,如果为零,则为假。即使循环没有主体,控制流仍然是:

检查条件 -> 在正文中执行语句 -> 检查条件

在这里,“检查条件”的意思是“评估语句并查看它是否非零”。

while 循环继续运行,直到 p1 指向零,此时控制传递给 printf。

例如

int main() 
{
    int array1[] = {2, 3, 1, 0, 3, 5};
    int array2[20];
    int * p2 = (int *)memset(array2, 0, 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
于 2011-10-03T14:27:08.543 回答
1
c=(a+b)++;

++运算符不适用于临时变量。(a+b)形成一个临时的。

while(*p2++=*p1++);

你在p2这里增加。循环结束后,p2不再指向上次malloc()调用返回的内存块的开头。

于 2011-05-30T07:09:08.917 回答