c语言中的求值顺序

首先弄清楚一个问题:求值顺序不是运算顺序

Q:什么是运算顺序?

A:运算顺序就是根据运算符号的优先级(结合性)来进行求值的过程

Q:什么是求值过程?

A:举个例子吧, D = A + B + C, 运算顺序是 A 先加 B 再加 C, 但是c语言并没有规定是先计算A的值还是B的值还是C的值; 这就是求值顺序。

求值顺序在某些情况下很值得注意

比如: f(), g(), h()是三个函数, 现在 a = f() + g() + h(), 运算顺序保证了f()首先与g()相加然后再加h(), 但是先计算哪个函数的值是不确定的[可能是f(), 可能是g(), 也可能是h()]。如果f(), g(), h()里面都引用了某个全局变量(不一定非要是全局变量), 那么先计算某个函数的值导致的 最后结果 a 也会不一样。比如: 你认为f()函数先调用, 然后是g(), 最后是h(); 这样在g()函数里面调用的全局变量的值就是 f()函数已经操作过的(可能已经更改), 同样h()操作的全局变量是已经经过了f()和g()函数操作的。但是事实上编译器并不一定要先计算f()函数, 相反可能会先计算h()函数, 这样 最后 a 的值就与你想象中的不是同一个数字。

c语言中有四个运算符规定了求值顺序

  • &&
  • ||
  • ?:

解释:

  • 对于&&和||运算符, 首先对做操作数进行求值, 如果这个表达式的值已经确定了, 那么不会对有操作数求值。对于三目运算符, a?b:c; 首先对操作数a求值, 根据a的值求操作数b或者c的值。对于逗号运算符, 首先对左操作数就进行求值, 然后将该值“丢弃”, 再对右操作数进行求值。

最后引用c陷阱与缺陷中的一个例子

下面这种从数组x中复制前n元素到数组y中的做法是不正确的, 因为对求值顺序进行了太多假设:


i = 0;
while(i < n)
y[i] = x[i++]

问题出在哪里呢? 上面的代码假设y[i]的地址将在i的自增操作执行之前被求值, 这一点并没有任何保证!在C语言的某些实现上, 有可能在i自增之前被求值; 而在另外的一些实现上, 有可能与此相反。同样的道理, 下面这种版本的写法与前类似, 也不正确


i = 0;
while(i<n)
y[i++] = x[i];

而另一方面, 下面这种写法却能正常工作:


i = 0;
while(i < n)
{
y[i] = x[i];
i++
}

当然这种写法可以简写为:

`for (i = 0; i < n; i++)
{
y[i] = x[i];
}

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 您好,根据您的问题,我可以回答。求顺序及格元素的平均值可以按照以下步骤进行: 1. 定义一个变量sum,用于存储及格元素的总和,初始值为。 2. 定义一个变量count,用于存储及格元素的个数,初始值为。 3. 遍历顺序的每个元素,如果该元素大于等于60,则将该元素加入sum,并将count加1。 4. 计算平均值,即sum/count。 以上是用C语言顺序及格元素的平均值的方法。希望能对您有所帮助。 ### 回答2: 要用C语言顺序及格元素的平均值,可以采取以下步骤: 1. 定义和初始化顺序表,包括需要存储的及格成绩; 2. 声明变量并初始化,用于计算及格成绩的总和和及格成绩的数量; 3. 使用循环遍历顺序的每个元素; 4. 判断每个元素是否及格,如果是则将其值加到总和,并增加数量; 5. 计算平均值,将总和除以数量; 6. 输出平均值。 下面是使用C语言编写的一个示例代码: ```c #include <stdio.h> #define MAX_SIZE 100 // 定义顺序表的最大长度 int main() { int scores[MAX_SIZE] = {90, 85, 60, 70, 95, 80}; // 假设成绩存储在顺序 int count = 0; // 及格成绩的数量 int sum = 0; // 及格成绩的总和 float average = 0.0; // 平均值 for (int i = 0; i < sizeof(scores) / sizeof(scores[0]); i++) { if (scores[i] >= 60) { // 判断是否及格,条件可根据需求调整 sum += scores[i]; count++; } } if (count > 0) { average = (float) sum / count; printf("及格成绩的平均值为: %.2f", average); } else { printf("没有及格成绩"); } return 0; } ``` 以上示例代码,假设顺序存储的是整型成绩,判断及格的条件是大于等于60分。计算平均值时,首先需要将sum强制转换为浮点型,以便得到浮点数结果。输出结果将保留两位小数。在实际应用,可以根据需要自行调整顺序表的长度和判断及格的条件。 ### 回答3: 要用C语言顺序及格元素的平均值,我们首先需要定义一个顺序表,并将数据存入其。然后,我们可以使用循环遍历顺序的所有元素,找出满足及格条件的元素,并将其相加。最后,计算累加和除以及格元素的个数,即可得到及格元素的平均值。 下面是实现这个功能的C语言代码: ```c #include <stdio.h> #define MAX_SIZE 100 // 假设顺序表的最大长度为100 int main() { int score[MAX_SIZE]; // 定义一个顺序表 int numOfScores; // 顺序的元素个数 int sum = 0; // 及格元素的累加和 int count = 0; // 及格元素的个数 float average; // 平均值 printf("请输入及格元素的个数:"); scanf("%d", &numOfScores); printf("请输入顺序的元素:"); for (int i = 0; i < numOfScores; i++) { scanf("%d", &score[i]); if (score[i] >= 60) { sum += score[i]; count++; } } if (count == 0) { printf("没有及格的元素。\n"); } else { average = (float)sum / count; printf("及格元素的平均值为:%f\n", average); } return 0; } ``` 以上代码,我们假设顺序表的最大长度为100,并通过`scanf`函数从用户处获取了及格元素的个数以及顺序的元素。然后,我们使用循环遍历顺序表的元素,并将满足及格条件的元素累加求和,并统计满足条件的元素个数。最后,我们通过除法将和除以个数,得到及格元素的平均值,并将结果打印输出。 请注意,以上代码假设用户输入的都是有效的数据,即输入的及格元素个数和顺序的元素均为整数。如果需要对用户输入做更多的错误处理,可以在代码添加相应的逻辑。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值