OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7008|回复: 12

请教个C语言基础问题

[复制链接]

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2016-1-18 22:22:27 | 显示全部楼层 |阅读模式
10金钱
本帖最后由 liuchang 于 2016-1-18 22:24 编辑

例如:
i[mw_shl_code=applescript,true]int temp = 0;
int add(int a,int b)
{
        return a+b;
}

int main()
{
        int a = 4;
        
        if((temp = add(2,3))>a)
        {
                ;
        }
}[/mw_shl_code]为什么代码执行完后,temp的值不是5,还是0啊?这个小弟理解不了~~~
换种表达方式,例如在
if(语句1)
或者
while(语句2)
请问语句1,语句2执行完判断以后,语句1和语句2是真的执行了吗?还是执行完判断以后恢复到初始值?为什么?

最佳答案

查看完整内容[请看2#楼]

会不会是被优化掉了?因为你if语句当中没有程序,编译程序可能就把你的这一句给优化掉了。楼上加了printf所以不会优化。 试试把temp改成 volatile int temp=0;
电子爱好者
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

548

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1383
金钱
1383
注册时间
2015-2-3
在线时间
197 小时
发表于 2016-1-18 22:22:28 | 显示全部楼层
本帖最后由 yyx112358 于 2016-1-19 13:08 编辑

会不会是被优化掉了?因为你if语句当中没有程序,编译程序可能就把你的这一句给优化掉了。楼上加了printf所以不会优化。
试试把temp改成
volatile int temp=0;
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-18 22:24:51 | 显示全部楼层
恳请大神指点,小弟经常在这里犯糊涂~
电子爱好者
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-18 22:28:13 | 显示全部楼层
[mw_shl_code=c,true]sys_thread_t sys_thread_new(const char *name, lwip_thread_fn thread, void *arg, int stacksize, int prio)
{
  static u32_t TaskCreateFlag=0;
  u8_t i=0;
~~~
  if(OSTaskCreate(thread, (void *)arg, &LWIP_STK_AREA[LWIP_STK_SIZE-1],prio)==OS_NO_ERR) /*例如这里,这里是会创建task任务吗*/{
       TaskCreateFlag |=(0x01<<i);

}
}
电子爱好者
回复

使用道具 举报

19

主题

702

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3339
金钱
3339
注册时间
2013-7-30
在线时间
708 小时
发表于 2016-1-18 22:29:50 | 显示全部楼层
int temp = 0;

int add(int a,int b)
{
        return (a+b);
}

int main()
{
        int a = 4;

        temp = add(2,3);

        if(temp > a)
        {
               //good luck ;
        }
}
思想很重要,无论做人还是编程!
我的技术公众号【微联智控工作室】
回复

使用道具 举报

43

主题

326

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2240
金钱
2240
注册时间
2014-10-20
在线时间
376 小时
发表于 2016-1-18 22:54:29 | 显示全部楼层
理论上应该是5,但你这种写法不排除会在某些编译器下出现错误
回复

使用道具 举报

5

主题

163

帖子

0

精华

高级会员

Rank: 4

积分
615
金钱
615
注册时间
2011-11-7
在线时间
180 小时
发表于 2016-1-18 23:08:06 | 显示全部楼层
在VS上跑了一下,实际运行结果是5,不知道楼主用的是什么编译器?
回复

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
 楼主| 发表于 2016-1-19 09:16:53 | 显示全部楼层
我按照4楼的程序在MDK上(使用stm32进行硬件仿真),跑出来是5,难道是我之前哪里出错了?
电子爱好者
回复

使用道具 举报

8

主题

35

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-12-22
在线时间
22 小时
发表于 2016-1-19 09:24:00 | 显示全部楼层
确认优化选项为 -O0
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-24
在线时间
32 小时
发表于 2016-1-19 10:26:10 | 显示全部楼层
#include"stdio.h"  int temp = 0; int c; int add(int a,int b) {          c = a+b;         return c; }   int main() {         int a = 4;                   if(add(2,3)>a)         {               printf("%d",c)  ;         } }楼主试试这么写
回复

使用道具 举报

2

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
79
金钱
79
注册时间
2015-11-24
在线时间
32 小时
发表于 2016-1-19 10:26:47 | 显示全部楼层
[mw_shl_code=c,true]#include"stdio.h"

int temp = 0;
int c;
int add(int a,int b)
{
         c = a+b;
        return c;
}

int main()
{
        int a = 4;
         
        if(add(2,3)>a)
        {
              printf("%d",c)  ;
        }
}[/mw_shl_code]

这样看的比较清楚
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2016-1-19 11:33:22 | 显示全部楼层
if((temp = add(2,3))>a)这个写法不是你想要的结果吧,哈哈,这样的写法的意思就是:你用了一个语句的真假和a这个值比较;改成 if(( add(2,3))>a)就可以了
回复

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2016-1-11
在线时间
8 小时
发表于 2016-1-19 17:16:46 | 显示全部楼层
不要写这种代码,要分开写,先赋值,再判断
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 00:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表