c语言中i++与++i的区别及运行效率

在c语言我们会经常把i++与++i弄混淆。

i++    是先使用,再自加(其自加是在遇到结束标志时才会进行)

即a = i;i=i+1;

++i    是先自加,再使用

即 i=i+1; a= i;

例如以下程序:

#include <stdio.h>

int main()

{

int i = 2;

int num;

num = (++i)+(++i)+(++i)+(++i);

printf("%d%d\n",num,i);

return 0;

}

其输出结果为:num = 19; i = 6。

其运算过程是:num = 4+4+5+6 = 19

i = i+4=6

#include <stdio.h>

int main()

{

int i = 2;

int num;

num = (i++)+(i++)+(i++)+(i++);

printf("%d%d\n",num,i);

return 0;

}

其运行结果为:num = 8;i = 6。

其运算过程是:num = 2+2+2+2 =8

i = i+4=6

我们在遇到像这样的i++,++i之类的可以这样看,把i++看做常量,把++i看做变量

如:将i 初始化为2,func是一个函数func(++i,i++)的结果为func(4,2);

函数的传参是从右边开始的,首先把i++看做是常量,++i看做变量,i的初始值是2,所以i++的值为2,++i的值为i,然后执行i=i+1,i=i+1,i的最后结果是4,所以++i的值就是4,所以结果为func(4,,2)。像func(i++,++i)的结果就是func(3,4);首先i=i+1,i = 3,所以i++的值为3,++i的值为i,然后再执行i = i+1,i的值为4,所以结果为func(3,4)。

i++与++i的效率

是内建数据类型时,它们的效率差别不大(去除编译器优化的影响)。所以在这种情况下我们大可不必关心。
自定义数据类型(主要是指类)时,此时我们不需要再做很多汇编代码的分析了,因为前缀式(++i)可以返回对象的引用,而后缀式(i++)必须产生一个临时对象保存更改前对象的值并返回(实现过自定义类型++运算符定义的就知道),所以导致在大对象的时候产生了较大的复制开销,引起效率降低,因此处理使用者自定义类型(注意不是指内建类型)的时候,应该尽可能的使用前缀式地增/递减,因为他天生体质较佳。

所以

内建数据类型的情况,效率没有区别。
自定义数据类型的情况,++i效率较高。





  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
RSS(Robust Statistics-based Smoothing)算法是一种基于鲁棒统计学原理的图像增强算法。它可以在去除噪声的同时,保留图像的边缘信息和细节,因此被广泛应用于图像处理领域。 以下是一个用C语言实现RSS图像增强算法的示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <math.h> #define ROWS 512 #define COLS 512 // RSS算法函数 void rss(int **img, int **out) { int i, j, k, l, sum, cnt; double median, mad, threshold, diff, sum2; int window[9]; for (i = 1; i < ROWS - 1; i++) { for (j = 1; j < COLS - 1; j++) { // 取3x3窗口 k = 0; for (l = -1; l <= 1; l++) { window[k++] = img[i-1][j+l]; window[k++] = img[i][j+l]; window[k++] = img[i+1][j+l]; } // 计算位数和MAD for (k = 0; k < 9; k++) { for (l = k+1; l < 9; l++) { if (window[k] > window[l]) { int tmp = window[k]; window[k] = window[l]; window[l] = tmp; } } } median = window[4]; mad = 0; for (k = 0; k < 9; k++) { diff = fabs(window[k] - median); mad += diff; } mad /= 9; // 计算阈值 threshold = 1.5 * mad; // 计算输出像素值 cnt = 0; sum = 0; sum2 = 0; for (k = 0; k < 9; k++) { diff = fabs(window[k] - median); if (diff <= threshold) { sum += window[k]; sum2 += window[k] * window[k]; cnt++; } } out[i][j] = sum / cnt - sqrt(sum2 / cnt - (sum / cnt) * (sum / cnt)); } } } int main() { int i, j; int **img, **out; FILE *fp; // 读入原始图像 img = (int**)malloc(sizeof(int*) * ROWS); for (i = 0; i < ROWS; i++) { img[i] = (int*)malloc(sizeof(int) * COLS); } fp = fopen("lena.dat", "rb"); for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { fread(&img[i][j], sizeof(int), 1, fp); } } fclose(fp); // 分配输出图像内存 out = (int**)malloc(sizeof(int*) * ROWS); for (i = 0; i < ROWS; i++) { out[i] = (int*)malloc(sizeof(int) * COLS); } // 调用RSS算法 rss(img, out); // 输出结果图像 fp = fopen("lena_rss.dat", "wb"); for (i = 0; i < ROWS; i++) { for (j = 0; j < COLS; j++) { fwrite(&out[i][j], sizeof(int), 1, fp); } } fclose(fp); // 释放内存 for (i = 0; i < ROWS; i++) { free(img[i]); free(out[i]); } free(img); free(out); return 0; } ``` 在这个示例代码,我们首先读入了一个512x512的灰度图像(假设图像数据以二进制格式保存在名为“lena.dat”的文件)。然后,我们调用了一个名为“rss()”的函数来对图像进行增强,并将增强后的结果保存到名为“lena_rss.dat”的文件。最后,我们释放了内存并返回了0以结束程序。 值得注意的是,由于RSS算法比较复杂,因此在实际应用可能需要进行一些参数调整才能得到最佳效果。同时,为了提高算法的效率,我们也可以尝试使用多线程或者GPU加速等方法来加速算法的运行

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值