数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 5184|回复: 19

[C51] [求助] 关于if语句

[复制链接]
发表于 2021-1-2 15:38:42 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
  1. #include <REGX52.H>
  2. #include "lcd1602.h"
  3. unsigned char x;
  4. void main()
  5. {
  6.     LCD1602_Init();
  7.     while(1)
  8.   {
  9.       if(x)//x!=0    x==1        x          0
  10.       {
  11.       //a=1;
  12.       LCD1602_ShowString(1,1,"a=1");
  13.      }
  14.      else
  15.     {
  16.     // b=1;
  17.      LCD1602_ShowString(1,1,"b=1");
  18.     }
  19.   }
复制代码
初学c51 有几句不是太明白的
有熟悉的坛友 可以帮帮我
x为全局变量 那么初始值应该为0
那么 if 里面的 x有这些情况
/*****
x==0        !x                                结果 a=1
x==1        x          0  x!=0                结果 b=1
*****/

x如果默认值 的话 0==0 结果应该是a=1  为什么是b=1呢

发表于 2021-1-2 15:43:57 | 显示全部楼层
仔细想想,你确定是这样?
刚开始x=0(严格来说x并不是个确定值,只是这里编译器给你清0了,且没有变动过)
那么if(x)就不会成立,当然是走的else分支,没毛病
if(x)等效于if(x!=0)而不是if(x==0)

打赏

参与人数 1家元 +10 收起 理由
xfriend360 + 10 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-2 15:49:42 | 显示全部楼层
decai 发表于 2021-1-2 15:43
仔细想想,你确定是这样?
刚开始x=0(严格来说x并不是个确定值,只是这里编译器给你清0了,且没有变动过)
那么i ...

我有点钻牛角尖哈。
那如果 我在main函数里
加上一句
x=0;
的话 那为啥还是结果为b=1呀?

谢谢
回复 支持 反对

使用道具 举报

发表于 2021-1-2 15:52:38 | 显示全部楼层
你逻辑设置错误,要判断X=0这个条件是否成立,应该用(X==0),而不是拿X的值(X)直接判断。
回复 支持 反对

使用道具 举报

发表于 2021-1-2 16:03:58 | 显示全部楼层
对于c/c++来说if中的判断true=0,所以初始化时的x=0,就会执行a=1的语句

打赏

参与人数 1家元 +3 收起 理由
xfriend360 + 3 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-2 16:12:48 | 显示全部楼层
ifix168 发表于 2021-1-2 15:52
你逻辑设置错误,要判断X=0这个条件是否成立,应该用(X==0),而不是拿X的值(X)直接判断。 ...

明白一点了
遇到if(x)
直接把它看成if(x!=0)
这样就可以对吧。

回复 支持 反对

使用道具 举报

发表于 2021-1-2 16:19:50 | 显示全部楼层
if(x)                     //如果x不为0,(可以是负数和正数,但声明了是正数,所以不能为负了)
      {  
      LCD1602_ShowString(1,1,"a=1");       //LCD1602j显示“a=1"
     }
     else                      //如果x为0
    {
     LCD1602_ShowString(1,1,"b=1");           //LCD1602显示”b=1".
    }

打赏

参与人数 1家元 +3 收起 理由
xfriend360 + 3 精彩回帖

查看全部打赏

回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2021-1-2 21:45:16 | 显示全部楼层
温力口 发表于 2021-1-2 16:19
if(x)                     //如果x不为0,(可以是负数和正数,但声明了是正数,所以不能为负了)
       ...

这个逻辑还是比较容易理解的
回复 支持 反对

使用道具 举报

发表于 2021-1-2 22:05:04 | 显示全部楼层
你这是判断if(x)的,其中x是条件,相当于(x!=0),所以在没有对x再次赋值的时候会执行else。如果你要判断x==0时候执行应该是if(x==0)

回复 支持 反对

使用道具 举报

发表于 2021-1-5 16:42:12 | 显示全部楼层
仿真运行下,就知道了,自己给X 赋值一下啊。
回复 支持 1 反对 0

使用道具 举报

发表于 2021-1-5 23:36:27 | 显示全部楼层
decai 发表于 2021-1-2 15:43
仔细想想,你确定是这样?
刚开始x=0(严格来说x并不是个确定值,只是这里编译器给你清0了,且没有变动过)
那么i ...

x 全局的,初始就是0 ,这是c规定的,不是不确定
回复 支持 反对

使用道具 举报

发表于 2021-1-6 09:24:56 | 显示全部楼层
程序里面没有给x赋值,虽然理论上编译器会给x赋值0,但是实际上但是没有赋值,x可能是任何值。之前我也遇到过这样的情况,给x赋值后,程序正常运行。做程序还是应该规范,凡是变量都应该初始化。
回复 支持 1 反对 0

使用道具 举报

发表于 2021-1-6 11:15:23 | 显示全部楼层
没赋值的全局变量统统扔到ZI区(ARM 架构下,别的也类似,x86叫bss),位置固定初始值全部清0(C规定),一个汇编循环搞定,这是毫无疑问的。
回复 支持 反对

使用道具 举报

发表于 2021-1-6 11:24:29 | 显示全部楼层
没有初始化的变量不能就武断的认为初值就是0
哪怕你知道按规定值应该是0,随手赋一个初值难道不香吗?
读代码也容易一些。
回复 支持 反对

使用道具 举报

发表于 2021-1-6 13:34:04 | 显示全部楼层
fan.lu 发表于 2021-1-5 23:36
x 全局的,初始就是0 ,这是c规定的,不是不确定

你不写初始化,值就是不确定。
在汇编层面,只是做了一个可用内存指针的移动。原来是什么值你读到就是什么值。
回复 支持 反对

使用道具 举报

发表于 2021-1-6 13:44:18 | 显示全部楼层
fan.lu 发表于 2021-1-6 11:15
没赋值的全局变量统统扔到ZI区(ARM 架构下,别的也类似,x86叫bss),位置固定初始值全部清0(C规定),一 ...
  1. #include <stdio.h>

  2. unsigned int a;
  3. unsigned int b;
  4. unsigned int c;

  5. int main( void ){
  6.         a=1;
  7.         printf("%x\n",b);
  8.         c=2;
  9.         return 0;
  10. }

复制代码

  1.         .file   "test.c"
  2.         .comm   a,4,4
  3.         .comm   b,4,4
  4.         .comm   c,4,4
  5.         .section        .rodata
  6. .LC0:
  7.         .string "%x\n"
  8.         .text
  9.         .globl  main
  10.         .type   main, @function
  11. main:
  12. .LFB0:
  13.         .cfi_startproc
  14.         pushq   %rbp
  15.         .cfi_def_cfa_offset 16
  16.         .cfi_offset 6, -16
  17.         movq    %rsp, %rbp
  18.         .cfi_def_cfa_register 6
  19.         movl    $1, a(%rip)
  20.         movl    b(%rip), %eax
  21.         movl    %eax, %esi
  22.         movl    $.LC0, %edi
  23.         movl    $0, %eax
  24.         call    printf
  25.         movl    $2, c(%rip)
  26.         movl    $0, %eax
  27.         popq    %rbp
  28.         .cfi_def_cfa 7, 8
  29.         ret
  30.         .cfi_endproc
  31. .LFE0:
  32.         .size   main, .-main
  33.         .ident  "GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.12) 5.4.0 20160609"
  34.         .section        .note.GNU-stack,"",@progbits
  35. ~     
复制代码


这是gcc产生的汇编,不会有任何的主动初始化。如果你说在crt0里有操作的话,那不属于c语言的特性。
回复 支持 反对

使用道具 举报

发表于 2021-1-6 16:39:13 | 显示全部楼层
换个编译器,或者调一下编译参数,会出警告吧?
变量未初始化之类的警告:lol:
回复 支持 1 反对 0

使用道具 举报

发表于 2021-1-7 09:50:14 | 显示全部楼层
本帖最后由 fan.lu 于 2021-1-7 10:29 编辑
tomac88 发表于 2021-1-6 13:44
这是gcc产生的汇编,不会有任何的主动初始化。如果你说在crt0里有操作的话,那不属于c语言的特性。 ...

c iso 里说:If an object that has automatic storage duration is not initialized explicitly, its value is indeterminate.
If an object that has static or thread storage duration is not initialized explicitly, then:
— if it has pointer type, it is initialized to a null pointer;
— if it has arithmetic type, it is initialized to (positive or unsigned) zero;
— if it is an aggregate, every member is initialized (recursively) according to these rules, and any
padding is initialized to zero bits;
— if it is a union, the frst named member is initialized (recursively) according to these rules, and
any padding is initialized to zero bits;


至于什么是static duration: An object whose identifer is declared without the storage-class specifer _Thread_local, and eitherwith external or internal linkage or with the storage-class specifer static, has static storage duration.
Its lifetime is the entire execution of the program and its stored value is initialized only once, prior
to program startup.

GCC能不遵守规范吗?
去查一下.comm 干嘛用的?
回复 支持 反对

使用道具 举报

发表于 2021-1-7 11:47:02 | 显示全部楼层
tomac88 发表于 2021-1-6 13:34
你不写初始化,值就是不确定。
在汇编层面,只是做了一个可用内存指针的移动。原来是什么值你读到就是什 ...

你说的是 automatic storage,跟static storage 不是一码事
回复 支持 反对

使用道具 举报

发表于 2021-1-7 11:48:38 | 显示全部楼层
jjbboox 发表于 2021-1-6 11:24
没有初始化的变量不能就武断的认为初值就是0
哪怕你知道按规定值应该是0,随手赋一个初值难道不香吗?
读代 ...

函数指针怎么初始化?
数组初始化是需要占ROM的(除非全0,和不写一样)

多读读Linux代码,一片的结构体和指针都没初始化,但这个是static storage,就是0

这是概念问题,非风格问题。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-25 16:10 , Processed in 0.358800 second(s), 17 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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