鱼C论坛

 找回密码
 立即注册
查看: 1533|回复: 7

[已解决]与while( *s++ = *t++ );等价的程序段是?

[复制链接]
发表于 2023-4-26 21:14:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
与while( *s++ = *t++ );等价的程序段是?

A.
while ( *t )
   *s++ = *t++;


B.
do {
    *s = *t++;  
} while ( *s++ );


C.while ( *s )
    *s++ = *t++;



D.
do {
    *s++ = *t++;  
} while ( *t  );
最佳答案
2023-4-26 22:20:35
a905448839 发表于 2023-4-26 22:16
能详细讲一下4段代码吗?感觉实现功能都一样,为什么会有一个正确答案。

当然可以。让我们逐个分析这4段代码:

A.
while ( *t )
   *s++ = *t++;

这段代码在 `*t`(源字符串的当前字符)不为零(即非空字符)时继续循环。循环体将 `*t` 复制到 `*s`,并将 `s` 和 `t` 的指针递增。但是,这段代码不会处理终止的空字符,因此它并不等价于 `while( *s++ = *t++ );`。

B.
do {
    *s = *t++;  
} while ( *s++ );

这段代码首先将 `*t` 复制到 `*s`,然后将 `t` 的指针递增。接下来,如果 `*s` 不为零,循环会继续,并将 `s` 的指针递增。这段代码确实处理了终止的空字符,与 `while( *s++ = *t++ );` 等价。

C.
while ( *s )
    *s++ = *t++;

这段代码在 `*s`(目标字符串的当前字符)不为零时继续循环。这会导致问题,因为我们不能保证目标字符串初始时就有一个空字符。因此,这段代码不等价于 `while( *s++ = *t++ );`。

D.
do {
    *s++ = *t++;  
} while ( *t  );

这段代码首先将 `*t` 复制到 `*s`,然后将 `s` 和 `t` 的指针递增。接下来,如果 `*t` 不为零,循环会继续。这段代码没有处理终止的空字符,因此它也不等价于 `while( *s++ = *t++ );`。

虽然这些代码段看起来很相似,但只有选项B正确处理了字符串的结束,并确保了源字符串(包括空字符)被完全复制到目标字符串。因此,选项B与 `while( *s++ = *t++ );` 等价。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-4-26 21:41:12 | 显示全部楼层
答案是 a。

选项 a 和选项 c 基本相同,但语句的作用略有不同。选项 a:指针 t 与指针 s 同时自增,即先自增再取值;而选项 c:指针 s 先自增再赋值。

选项 b 和选项 d 将在 *s 赋值后再将指针 s 和 t 同时自增,这样会使得 *t 多一个值的判断处理,因此 b 和 d 不等价于 while( *s++ = *t++ )。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-26 22:08:19 | 显示全部楼层
sfqxx 发表于 2023-4-26 21:41
答案是 a。

选项 a 和选项 c 基本相同,但语句的作用略有不同。选项 a:指针 t 与指针 s 同时自增,即先 ...

我问过GPT 但是这题正确答案是B...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-26 22:13:33 | 显示全部楼层
与 `while( *s++ = *t++ );` 等价的程序段是:

B.
do {
    *s = *t++;  
} while ( *s++ );

这两段代码都实现了将字符串 `t` 复制到字符串 `s` 的功能,包括终止的空字符。当 `*t` 为零(即空字符)时,循环将停止。在这两段代码中,首先将 `t` 中的字符复制到 `s`,然后递增 `s` 和 `t` 的指针。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-26 22:16:34 | 显示全部楼层
isdkz 发表于 2023-4-26 22:13
与 `while( *s++ = *t++ );` 等价的程序段是:

B.

能详细讲一下4段代码吗?感觉实现功能都一样,为什么会有一个正确答案。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-26 22:17:33 | 显示全部楼层
a905448839 发表于 2023-4-26 22:16
能详细讲一下4段代码吗?感觉实现功能都一样,为什么会有一个正确答案。

6
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-26 22:18:23 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-26 22:20:35 | 显示全部楼层    本楼为最佳答案   
a905448839 发表于 2023-4-26 22:16
能详细讲一下4段代码吗?感觉实现功能都一样,为什么会有一个正确答案。

当然可以。让我们逐个分析这4段代码:

A.
while ( *t )
   *s++ = *t++;

这段代码在 `*t`(源字符串的当前字符)不为零(即非空字符)时继续循环。循环体将 `*t` 复制到 `*s`,并将 `s` 和 `t` 的指针递增。但是,这段代码不会处理终止的空字符,因此它并不等价于 `while( *s++ = *t++ );`。

B.
do {
    *s = *t++;  
} while ( *s++ );

这段代码首先将 `*t` 复制到 `*s`,然后将 `t` 的指针递增。接下来,如果 `*s` 不为零,循环会继续,并将 `s` 的指针递增。这段代码确实处理了终止的空字符,与 `while( *s++ = *t++ );` 等价。

C.
while ( *s )
    *s++ = *t++;

这段代码在 `*s`(目标字符串的当前字符)不为零时继续循环。这会导致问题,因为我们不能保证目标字符串初始时就有一个空字符。因此,这段代码不等价于 `while( *s++ = *t++ );`。

D.
do {
    *s++ = *t++;  
} while ( *t  );

这段代码首先将 `*t` 复制到 `*s`,然后将 `s` 和 `t` 的指针递增。接下来,如果 `*t` 不为零,循环会继续。这段代码没有处理终止的空字符,因此它也不等价于 `while( *s++ = *t++ );`。

虽然这些代码段看起来很相似,但只有选项B正确处理了字符串的结束,并确保了源字符串(包括空字符)被完全复制到目标字符串。因此,选项B与 `while( *s++ = *t++ );` 等价。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 01:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表