c语言中纯粹的if语句耗时吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c语言中纯粹的if语句耗时吗相关的知识,希望对你有一定的参考价值。

比如
if(a>7) a=1;这句占用几个机器周期?
下面这句呢?
if(a>7)

if(a>10)

if(a>15)

a=1;



这两种耗时各是多少个机器周期?是不是第二个多一些?如果是的话if语句做一次比较耗时几个周期啊?谢谢了!

参考技术A 要算机器周期的话,还取决于实际的软硬件环境的,
给你一个程序实验一下:
#include <stdio.h>

__forceinline unsigned _int64 My_clock(void)

_asm _emit 0x0F
_asm _emit 0x31

unsigned _int64 Start(void) return My_clock(); // 开始时间
unsigned _int64 Stop(unsigned _int64 m_start, unsigned _int64 m_overhead)
return My_clock()-m_start - m_overhead; // 停时间

void main()

unsigned _int64 m_start=0, m_overhead=0;
unsigned int N;
int a;
m_start = My_clock();
m_overhead = My_clock() - m_start - m_overhead;
m_start = My_clock(); // 正式开始
//测试程序段 Start
//这里写你要计算耗时的程序段!!!!!!!!!!!!!!!!!!!!!!!!
//测试程序段 End
N = Stop(m_start,m_overhead); // 获取耗时.
printf("Time:%I64d us\n", N);


我VC6+win7环境测试了一下:
#include <stdio.h>

__forceinline unsigned _int64 My_clock(void)

_asm _emit 0x0F
_asm _emit 0x31

unsigned _int64 Start(void) return My_clock(); // 开始时间
unsigned _int64 Stop(unsigned _int64 m_start, unsigned _int64 m_overhead)
return My_clock()-m_start - m_overhead; // 停时间

void main()

unsigned _int64 m_start=0, m_overhead=0;
unsigned int N;
int a;
m_start = My_clock();
m_overhead = My_clock() - m_start - m_overhead;
m_start = My_clock(); // 正式开始
//测试程序段 Start
if(a>7) a=1;
//测试程序段 End
N = Stop(m_start,m_overhead); // 获取耗时.
printf("Time:%I64d us\n", N);

耗时10us左右

下面这句呢?
if(a>7)

if(a>10)

if(a>15)

a=1;




#include <stdio.h>

__forceinline unsigned _int64 My_clock(void)

_asm _emit 0x0F
_asm _emit 0x31

unsigned _int64 Start(void) return My_clock(); // 开始时间
unsigned _int64 Stop(unsigned _int64 m_start, unsigned _int64 m_overhead)
return My_clock()-m_start - m_overhead; // 停时间

void main()

unsigned _int64 m_start=0, m_overhead=0;
unsigned int N;
int a;
m_start = My_clock();
m_overhead = My_clock() - m_start - m_overhead;
m_start = My_clock(); // 正式开始
//测试程序段 Start
if(a>7)

if(a>10)

if(a>15)

a=1;



//测试程序段 End
N = Stop(m_start,m_overhead); // 获取耗时.
printf("Time:%I64d us\n", N);

耗时30us左右。追问

这个方法挺好,编译器不优化了,本来我是想用三个变量代替这几个a,这样编译器也应该不会优化了吧,恩,谢谢这位匿名大哥哈!!

本回答被提问者采纳
参考技术B 具体我不知道,但是我知道的是,if语句还是比较需要开销的,而且if嵌套的话更加厉害,就是说,假如
if(a>7)a=1; 需要的机器时间和资源是 单位1 ,
那么
if(a>7) if(a>10)a=1; 需要的机器时间和资源 >2。追问

哦,多谢啦

参考技术C 肯定耗时。除非该段程序为垃圾段,被优化。
不然肯定要耗时,至于多少个机器周期,那就要具体看硬件环境了。
有就是不同的单片机有所不同追问

恩,我用都是计算机,不是单片机。。。多谢了啊

参考技术D if做一次比较和对a进行一次赋值周期是一样的,都是CPU的最短周期单位。

另外你下面这段代码,编译器一般会优化称一个if的追问

if(a > 7)

a=2;
a=4;
a=5;

这个会优化成a=5吗?谢谢!
另外这个能不能不让它优化啊?我想用时间变量看看到底耗时多少

追答

这个你是不能用时间变量的,因为精度不够

优化取决于你用的是什么编译器以及你的优化选项

你可以看汇编代码来看优化结果

追问

精度微妙级的就够了,我让它循环,呵呵。。。汇编没有学过,唉,多谢啦

第5个回答  2012-02-01 一般编辑器会优化代码,如果真的要算,得看编译后的assembly代码了
譬如说 :
mov = 1 cycle
and = 1 cycle
jmp = 1 cycle追问

哦,这个还没有看过,不是太懂,我还是需要多加学啊,谢谢啦!

多个if else if语句的用法?

if rvotp<>1 then
Response.Redirect "../inc/D_error.htm"
end if
最初的代码是函数值rvotp等于1则end if。
不等于1,则其他函数复回值都统一转向同一个报错页面D_error.htm。

我想把0,1,2,3这四个不同的rvotp复回值,指向不同的报错页面,请各位大侠帮忙看看哪里有问题。
If rvotp =0 Then
Response.Redirect "../inc/A_error.htm"
else if

if rvotp=2 then
Response.Redirect "../inc/B_error.htm"
else if

if rvotp=3 then
Response.Redirect "../inc/C_error.htm"
else if

end if
rvotp=1时end if,上面打错了

完全语法错误,无论是何种语言,else都是跟与其最近的一个没有配套的if相配

第一个else if跟=0配套,但是第二个是跟=2配套,同样第三个是跟=3的配套,按照你的写法,这里不是一个if..else..if结构,而是多个if..else..if嵌套

正确的写法应该是:

if rvotp=0 then

......

else if rvotp=2 then

.....

else if ......

.....

end if

扩展资料:

特点编辑

在同一个 if 结构中可以有多个 elseif 语句。第一个表达式值为 TRUE 的 elseif 语句(如果有的话)将会执行。在 php 中,也可以写成“else if”(两个单词),它和“elseif”(一个单词)的行为完全一样。

句法分析的含义有少许区别(如果你熟悉 C 语言的话,这是同样的行为),但是底线是两者会产生完全一样的行为。

elseif 的语句仅在之前的 if 或 elseif 的表达式值为 FALSE,而当前的 elseif 表达式值为 TRUE 时执行。

参考资料来源:百度百科-else if

参考技术A

在else语句里继续嵌套if语句即可。

在同一个 if 结构中可以有多个 elseif 语句。

第一个表达式值为 TRUE 的 elseif 语句(如果有的话)将会执行。在 php 中,也可以写成“else if”(两个单词),它和“elseif”(一个单词)的行为完全一样。

句法分析的含义有少许区别(如果你熟悉 C 语言的话,这是同样的行为),但是底线是两者会产生完全一样的行为。

elseif 的语句仅在之前的 if 或 elseif 的表达式值为 FALSE,而当前的 elseif 表达式值为 TRUE 时执行。

扩展资料

if语句的语法如下所示(if和else是C#的关键字):

if(booleanExpression)

statement-1;

else

statement-2;

如果booleanExpression(布尔表达式)求值为true,就运行statement-1;否则运行statement-2。else关键字和后续的statement-2是可选的。

如果没有else子句,而且booleanExpression求值为false,那么什么也不会发生,程序继续执行if语句之后的代码。注意,布尔表达式必须放在圆括号中,否则无法编译。

参考资料来源:百度百科--else if

参考技术B

if(表达式一)
语句块一//符合表达式执行的代码
else if(表达式二)
语句块二//符合表达式执行的代码
else if(表达式三)
语句块三//符合表达式执行的代码
……
else
语句块n//符合表达式执行的代码


#include <stdio.h>
int main(void)
   int a, b;
   printf("input two numbers:     ");
   scanf("%d%d",&a,&b);
   if(a>b)
       printf("max=%d\\n",a);
   else
       printf("max=%d\\n",b);
   return 0;

参考技术C 完全语法错误,无论是何种语言,else都是跟与其最近的一个没有配套的if相配
第一个else if跟=0配套,但是第二个是跟=2配套,同样第三个是跟=3的配套,按照你的写法,这里不是一个if..else..if结构,而是多个if..else..if嵌套
正确的写法应该是:
if rvotp=0 then
......
else if rvotp=2 then
.....
else if ......
.....
end if本回答被提问者采纳

以上是关于c语言中纯粹的if语句耗时吗的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中,if和else if是否在不加花括号的情况下也是一个复合语句

关于C语言中if else的用法,高手来帮下忙

c语言中的 条件语句 if else

c语言中的条件语句if

C语言中的条件赋值语句和if——else语句执行效率比较,哪一个效率高些,坐等高手解惑

C语言——if之后的语句真的不会执行吗?