有谁能否帮我解释一下C语言中的volatile关键字,最好是要有程序例子的。谢谢啊!!

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有谁能否帮我解释一下C语言中的volatile关键字,最好是要有程序例子的。谢谢啊!!相关的知识,希望对你有一定的参考价值。

推荐一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables)
3). 多线程应用中被几个任务共享的变量
如TI corn 3的std_het.h文件里就有volatile的使用,
/*---------------------------------------------*/
/* ACMP INSTRUCTION */
/*---------------------------------------------*/
typedef volatile struct acmp_format

unsigned int : 11 ;
unsigned int brk : 1 ;
unsigned int next_program_address : 8 ;
unsigned int op_code : 4 ;
unsigned int : 3 ;
unsigned int : 5 ;

unsigned int : 10 ;
unsigned int auto_read_clear : 1 ; /**/
unsigned int en_pin_action : 1 ;
unsigned int cond_addr : 8 ;
unsigned int pin_select : 5 ;
unsigned int : 2 ;
unsigned int pin_action : 1 ;
unsigned int : 1 ;
unsigned int t_register_select : 1 ;
unsigned int ab_register_select : 1 ;
unsigned int interrupt_enable : 1 ;

unsigned int : 7 ;
unsigned int data : 20 ;
unsigned int : 5 ;

ACMP_FIELDS;

typedef volatile union

ACMP_FIELDS acmp ;
HET_MEMORY memory ;
ACMP_INSTRUCTION;
详细说明可以看看参考对volatile的说明。

参考资料:http://baike.baidu.com/view/608706.htm

参考技术A volatile 关键字告诉编译器改变量是一个“易变”变量,避免编译器将该变量进行优化为寄存器型,如优化为寄存器类型,则程序对该变量的操作只对寄存器起作用,而不会操作与真正的外设地址。多用于对外设(如寄存器)的声明。
如 #define REG_CTRL_VAL (*((volatile unsigned int *)0x4000 0000))
参考技术B 告诉编译器这是一个多线程程序使用的变量,初学没什么用,不用深究~

请帮我解释一下这个函数(C语言)

题目:编写一个函数,输入一行字符,将此字符串中最长的单词输出。
#include <stdio.h>
#include<string.h>
void main()
int alphabetic(char);
int longest(char[]);
int i;
char line[100];
printf("input one line:\n");
gets(line);
printf("The longest word is:");
for(i=longest(line);alphabetic(line[i]);i++)
printf("%c",line[i]);
printf("\n");


int alphabetic(char c)
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1);
else
return(0);


int longest(char str[])
int i,len=0,length=0,flag=1,place=0,point;
for(i=0;i<strlen(str);i++)
if(alphabetic(string[i]))
if(flag)
point=i;
flag=0;

else len++;
else
flag=1;
if(len>=length)
length=len;
place=point;
len=0;



return(place);


因为我是初学者,有点不懂这个程序,可以帮我详细解释一下吗?谢谢。
(1)最不懂int longest(char str[]) 一下的部分
(2)这句看不懂:for(i=longest(line);alphabetic(line[i]);i++)
(3)整个程序是如何运行的呢?


#include <stdio.h>
#include<string.h>
void main()

int alphabetic(char);
int longest(char[]);
int i;
char line[100];
printf("input one line:\\n");
gets(line);
printf("The longest word is:");
for(i=longest(line);alphabetic(line[i]);i++)
 printf("%c",line[i]);

printf("\\n");

//这是一个判断字符是否是英文字母的函数
//是则返回1,不是则返回0
 int alphabetic(char c)
 
if((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
return(1); 

else
return(0);

  
 //这个函数是来统计哪一个连续字母子字符串最长
 //并返回那个子字符串在str中的起始位置
int longest(char str[]) 

int i,len=0,length=0,flag=1,place=0,point; 
for(i=0;i<strlen(str);i++) //循环str中所有的字符
//判断是否是字母,如果是(返回1)则进入,
//否则(返回0)进入else语句
if(alphabetic(str[i])) //根据代码来看不是string[i],更改之
if(flag)//flag标志应该是指是否是连续出现字母 

point=i;//记录当前全是字母的子字符串的起始位置
flag=0;//更改标记,下一次如还是字母就不能再进这个if判断了,而应该是进入else,把长度+1
 
else 
len++; 
else
flag=1;//如果出现了非字母,那么将标记置为1,以便下次出现字母时,进入判断的if中,而不是else中 
if(len>=length) //如果之前有出现连续字母的情况或者新的子字符串大于上一个的长度,则进入

length=len; //记录新的长度
place=point; //记录新的起始位置
len=0; //将这个变量置为0,以便下一次的记录
 
 

return(place); //返回最长字母字符串的起始位置

追问

你好,我运行一下这个程序,输出的不是最长的那个单词,是哪里出现问题了吗?

追答

哦,试了半天发现才发现你说的情况。
当时没注意看代码,是这个样子滴(输入下图中的字符)

这样子的话,在判断了最后一个字母h的时候,会进入那个 len++的语句,然后不执行记录位置的那个语句了,最后一次的for循环就直接结束了,进入最后一句代码。

这样的原因是,原代码中记录下最长字母的语句是和if(alphabetic(str[i])) 是同一级别的,只有在if(alphabetic(str[i]))判断不是字母的时候才会执行。


所以最简单的改法就是,在那个

longest(char str[]) 的for循环语句的最后加上

if (i == strLength -1)//如果是最后一次则再判断一次

if(len>length) 

length=len;
place=point;
len=0;



///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



另外发现另外一个问题,在

if(flag)//flag标志应该是指是否是连续出现字母 

point=i;//记录当前全是字母的子字符串的起始位置
flag=0;//更改标记,下一次如还是字母就不能再进这个if判断了,而应该是进入else,把长度+1
 
这段语句中也应该写上 len++ 哦....

参考技术A 这个程序有问题吧。编译肯定不过哎
(1)把第三个函数快中的string改成str就对了 ;这是求最长单词从何处开始的
(2)初值:最长单词的开始初;条件:下一个字符是字母;
(3)输入一个字符串,求出最长单词的头字母所在位置,输出最长的单词追问

str那里是我不小心打错了

追答

改了之后就ok了啊

参考技术B 此程序存在严重错误,不能运行。追问

请问哪里有错误?

追答

C参照2楼回答,我就不看了,

以上是关于有谁能否帮我解释一下C语言中的volatile关键字,最好是要有程序例子的。谢谢啊!!的主要内容,如果未能解决你的问题,请参考以下文章

c语言的if函数,能否有大佬能解释一下用法?

帮我解释一下这个C语言程序?

volatile关键字能否保证线程安全?

请帮我解释一下这个函数(C语言)

C语言中的关键字volatile

C语言中的volatile