缘由https://ask.csdn.net/questions/7895988
鉴于初学知识储备不足认识模糊,这篇文章就从最基础的C++知识入手,用详细资料来描述这个程序关联的知识,由于本程序使用一行语句完成运算,因此,将按运算符(自左向右)结合律逐步展开。
1、C++ 函数
函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。
您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。
函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。
C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。
函数还有很多叫法,比如方法、子例程或程序,等等。
定义函数
C++ 中的函数定义的一般形式如下:
return_type function_name( parameter list ){ body of the function}
在 C++ 中,函数由一个函数头和一个函数主体组成。下面列出一个函数的所有组成部分:
返回类型:一个函数可以返回一个值。return_type 是函数返回的值的数据类型。有些函数执行所需的操作而不返回值,在这种情况下,return_type 是关键字 void。
函数名称:这是函数的实际名称。函数名和参数列表一起构成了函数签名。
参数:参数就像是占位符。当函数被调用时,您向参数传递一个值,这个值被称为实际参数。参数列表包括函数参数的类型、顺序、数量。参数是可选的,也就是说,函数可能不包含参数。
函数主体:函数主体包含一组定义函数执行任务的语句。
2、C++ 循环
有的时候,可能需要多次执行同一块代码。一般情况下,语句是顺序执行的:函数中的第一个语句先执行,接着是第二个语句,依此类推。
编程语言提供了允许更为复杂的执行路径的多种控制结构。
循环语句允许我们多次执行一个语句或语句组,下面是大多数编程语言中循环语句的一般形式:
![](https://i-blog.csdnimg.cn/blog_migrate/99ec1ca73e4ffc647d9caa0acd5f3be6.png)
循环类型
C++ 编程语言提供了以下几种循环类型。点击链接查看每个类型的细节。
循环类型 | 描述 |
当给定条件为真时,重复语句或语句组。它会在执行循环主体之前测试条件。 | |
多次执行一个语句序列,简化管理循环变量的代码。 | |
除了它是在循环主体结尾测试条件外,其他与 while 语句类似。 | |
您可以在 while、for 或 do..while 循环内使用一个或多个循环。 |
循环控制语句
循环控制语句更改执行的正常序列。当执行离开一个范围时,所有在该范围中创建的自动对象都会被销毁。
C++ 提供了下列的控制语句。点击链接查看每个语句的细节。
控制语句 | 描述 |
终止 loop 或 switch 语句,程序流将继续执行紧接着 loop 或 switch 的下一条语句。 | |
引起循环跳过主体的剩余部分,立即重新开始测试条件。 | |
将控制转移到被标记的语句。但是不建议在程序中使用 goto 语句。 |
3、C++ 自增自减运算符:
自增运算符 ++ 会把操作数加 1,自减运算符 -- 会把操作数减 1。因此:
x = x+1;
等同于
x++;
同样的:
x = x-1;
等同于
x--;
无论是自增运算符还是自减运算符,都可以放在操作数的前面(前缀)或后面(后缀)。例如:
x = x+1;
可以写成:
++x; // 前缀形式
或者:
x++; // 后缀形式
前缀形式与后缀形式之间有一点不同。如果使用前缀形式,则会在表达式计算之前完成自增或自减,如果使用后缀形式,则会在表达式计算之后完成自增或自减。
因此,此程序中的++q就属于前缀式,当程序GOTO循环运行到++q时就会对q的值+1操作。
4、赋值运算符
下表列出了 C++ 支持的赋值运算符:
运算符 | 描述 | 实例 |
= | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C |
+= | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A |
-= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A |
*= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A |
/= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A |
%= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A |
<<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 |
>>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 |
&= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 |
^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 |
|= | 按位或且赋值运算符 | C |= 2 等同于 C = C | 2 |
具备了以上C++知识,就可以来解读这个函数是如何执行完成既定任务了;执行函数时,自行顺序自上而下逐条执行,首先是变量的声明,定义了4个INT类型的变量,其中n用于输入一个数表示范围,q用于从1到n每次执行自增,h用于每次加上q,l用于每次加上h,从而完成题目中的1+(1+2)+(1+2+3...n)这样功能;
当输入n的值后就进入由GOTO构成的有条件循环,进入循环前判断q是否小于n,若小于则条件符合进入循环内,执行 l += h += ++q语句,按运算符自左向右结合,首先自行++q,因为q初始值为0,因此自增为1,再向左执行h+=赋值也为1,再向左执行l+=赋值也为1,这样这条语句就算执行完毕了,就完成了题目要求运算的第一项1,按程序执行顺序接下来就执行goto语句跳转到标记qh,之后执行下一条判断语句,这样就又回到了goto构成的有条件循环的判断,加入n的值为输入的2,则q这是为1,符合判断条件再次进入循环体内,接下来又执行l += h += ++q语句,这时++q为2,h原先有1再+2这样就完成了题目中的第二项(1+2)l原先有1再加h就完成了题目中的1+(1+2)功能,上面假设我们输入了2,那么这样就完成了题目要求的1到n的运算了即1+(1+2),这时执行goto跳转到qh语句后判断q不小于n了,因此就不会再次进入goto构成的有条件循环体内,也即结束了循环,按程序执行顺序这时执行std::cout << l << "\n"语句输出运算完成的值,这样就完成了题目既定任务了,同样道理若输入为3则执行分析如上述步骤运算后输出运算值,这样就把函数是如何工作的道理讲明了。
void (1+1+2+1+2+3+到1+2+3+到+n)()
{//缘由https://ask.csdn.net/questions/7895988
int h = 0, q = 0, l = 0, n = 0;
std::cin >> n;
qh:if (q < n)
{
l += h += ++q;
goto qh;
}
std::cout << l << "\n";
}
![](https://i-blog.csdnimg.cn/blog_migrate/43a424484ca9846e48281340e86affd4.png)