gpt4 book ai didi

C语句的副作用和序列点

转载 作者:行者123 更新时间:2023-12-04 06:27:57 24 4
gpt4 key购买 nike

再次向所有专家问好,我再次偶然发现了几个问题。

故事 :

我读了一本书提到一个序列点是;是在它前进到下一个语句之前应该评估它之前的所有副作用的点。为了使我的问题的上下文干净,我将编写一个简单的代码。

编码 :

while (guess++ < 10)
{
printf("%d \n" , guests);

我的想法和问题:

1.)从上面的代码, while语句测试条件 guess++ < 10是一个完整的表达式。所以在我的心态中它不是一个声明,因为它不以 ; 结尾。 .

2.)由于使用了后缀增量运算符,因此 guess在增加之前评估的值。

3.)书中提到在 guess之后执行自增操作。变量用于关系运算,那么只有 printf()职能将履行其职责。

4.) 我的问题是,因为测试条件不以 ; 结束,因此它不是声明。但是为什么在 printf()之前实现了增量操作?函数被调用,但不是在 print() 之后功能只有它正在增加?

5.)也许这是一个附带问题,书中提到 while是结构化语句,但为什么我没有看到尾随 ;附加在上面 while(testcondition); .

6.)这听起来可能是一个愚蠢的问题,但有时当我阅读其他人编写的一些源代码时,我会看到其中一些人放置了大括号 { while 循环与 while() 在同一行,这导致它是这样的 while(testcondition){ .这是惯例还是这样做有什么特殊原因??

感谢您花时间阅读我的问题,非常感谢您的帮助。

最佳答案

回答问题 1:while 循环括号内的代码实际上是一个完整的表达式。来自 wikipedia :

This category includes expression statements (such as the assignment a=b;), return statements, the controlling expressions of if, switch, while, or do-while statements, and all three expressions in a for statement.



在 C 常见问题解答中可以找到对完整表达式的很好的描述:

full expression The complete expression that forms an expression statement, or one of the controlling expressions of an if, switch, while, for, or do/while statement, or the expression in an initializer or a return statement. A full expression is not part of a larger expression. (See ANSI Sec. 3.6 or ISO Sec. 6.6.)



请务必注意,完整表达式与语句或分号标记无关。

所以让我们深入研究一下。修复你的代码片段我想出了这个:
#include <stdio.h>
int main(void)
{
unsigned guess = 0;
while (guess++ < 10)
{
printf("%d " , guess);
}
return 0;
}

产生这个输出:

1 2 3 4 5 6 7 8 9 10



所以这意味着评估将等同于以下代码:
while (guess < 10)
{
guess++;
printf("%d " , guess);
}

问题 5 的答案可以在这个 stackoverflow 问题中找到:
In C/C++ why does the do while(expression); need a semi colon?

关于C语句的副作用和序列点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5811650/

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