a905448839 发表于 2023-4-26 21:14:47

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

与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);

sfqxx 发表于 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++ )。

a905448839 发表于 2023-4-26 22:08:19

sfqxx 发表于 2023-4-26 21:41
答案是 a。

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

我问过GPT 但是这题正确答案是B...

isdkz 发表于 2023-4-26 22:13:33

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

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


这两段代码都实现了将字符串 `t` 复制到字符串 `s` 的功能,包括终止的空字符。当 `*t` 为零(即空字符)时,循环将停止。在这两段代码中,首先将 `t` 中的字符复制到 `s`,然后递增 `s` 和 `t` 的指针。

a905448839 发表于 2023-4-26 22:16:34

isdkz 发表于 2023-4-26 22:13
与 `while( *s++ = *t++ );` 等价的程序段是:

B.


能详细讲一下4段代码吗?感觉实现功能都一样,为什么会有一个正确答案。

sfqxx 发表于 2023-4-26 22:17:33

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

6

a905448839 发表于 2023-4-26 22:18:23

sfqxx 发表于 2023-4-26 22:17
6

{:5_107:}

isdkz 发表于 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++ );` 等价。
页: [1]
查看完整版本: 与while( *s++ = *t++ );等价的程序段是?