gpt4 book ai didi

c - for 循环中的参数,缺少第一个?

转载 作者:行者123 更新时间:2023-12-04 10:39:18 26 4
gpt4 key购买 nike

我不明白这里的for循环。有人可以向我解释吗?通常情况下。这个缺少第一个陈述,第二个陈述不同。

/* strcmp: return <0 if s<t, 0 if s==t, >0 if s>t */
int strcmp(char *s, char *t)
{
for ( ; *s == *t; s++, t++)
if (*s == '\0')
return 0;
return *s - *t;
}

最佳答案

根据 C 标准 $6.8.5.3。对于以下语句:

 `for(clause_1;expression-2;expession-3) statement` 

clause-1expression-3 都可以省略,expression-2 可以用非零常量代替。

编译器的 Action

要从根本上回答您的问题,让我们看看编译器如何处理您的代码。

对于你代码中的for循环stmt

从编译器的角度来看,循环最终会转化为如下以条件向后跳转指令结束的指令序列。

   ...
INST1
INST2
COND_JMP LABEL2
LABEL1:
INST3
INST4
INST5
COND_JMP LABEL1

LABEL2:
...

forclause-1会放在LABEL1之前,比如INST1INST2,因此省略这样的代码是可以的。因为开发人员也可以将此类操作放在 for 语句之前。

expression 3 将被放入循环体(LABEL1COND_JMP LABEL1 之间的指令序列),因此epression 3 代码也可以直接用 c 代码放入循环体中,这就是为什么 expression 3 也可以省略的原因。

expression 2 将是COND_JMP 指令使用的条件,因此如果直接省略,则意味着编译器不会在 COND_JMP 之外插入循环体,这会使 for 语句没有意义,这就是为什么 expression 2 只能用非零常量替换的原因。当用非零常量替换时,在 C 中表示始终为真,则循环将成为无限循环。

对于你的for stmt expression-3

的逗号

根据C标准6.5.17,逗号表达式如下。

  expression, expression-2, expression-3..., expression-last

这里的表达式可以是普通表达式,也可以是赋值表达式。

对于这样的逗号表达式,编译器将生成代码来计算所有这些表达式,并返回最后一个的类型和值作为逗号表达式的返回类型和值。

关于c - for 循环中的参数,缺少第一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29752688/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com