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

博客介绍了C语言中通常if(0)后面的语句不会执行,但存在特殊情况如Clifford's Device,利用switch-case结构避免fall through。还探讨了goto语句和strtol()函数的用法,强调在实际编程中应遵循规范。
摘要由CSDN通过智能技术生成

1、序

学过c语言的都知道,通常:If(0)之后的代码是不执行的,网上也有详细的说明。

1.1、形式:

if (表达式) { 语句... }

1.2、解释:

在执行if语句时,首先会计算表达式的值,如果表达式的值为零,语句不会执行,若非零,则执行语句。由此可见if (0) 表示不执行,if (1)表示要执行。if (x)根据x的值是否为0来决定是否执行,他等价于if (x != 0)。

if语句中的条件无论是什么最终都要转换成一个布尔值,因此,

1.3、举个例子

if(x)相当于if(x != 0)

对于x为指针,相当于if(x != NULL)

而if(1)

因为1为整型,相当于if(1 != 0)

1肯定不等于0,所以就相当于一定执行if里面的语句.

而if(0)相当于if(0 != 0)

这肯定不成立,所以一定不会执行if中的语句.

 

x == 1,x != 1也是表达式,称为关系表达式,在C语言里,关系成立,表达式的值为1,不成立则为0,所以1>2的值为0,1!=2的值为1。C语言老师应该提到过,x大于2小于5不能写成 2 < x < 5,因为这货会被解释为(2 < x) < 5,无论x取多少,这个式子的值恒为1(根据刚刚说的应该能理解为什么了吧)。

x=1也是一种表达式,叫赋值表达式,他的值就是等号右边的式子的值,也就是1。所以if(x=1)无论x原来为多少if语句都会成立,并且会将x的值改写为1,和if(x==1)有着非常大的区别(那么,if(x=0)呢?),正是x=1这个表达式是有值的,C语言才允许if(x=1)这种写法,一些语言里x=1这个式子是没有值的,只是将x赋值为1,这样写就会报错,如Java。C语言代码里出现if(x=1)一般情况下是你写错了,可能想表达的是if(x==1)。现在的编译器里,if(x=1)一般都会有警告提示你,可能写错了。

总之,在C语言了里,像if,for,while这些语句本质上都是通过求出括号里表达式的是否为0来决定运行流程的,所以像if(scanf("%d",&a))这种代码也是可以理解了的。

上面的文字应该不难理解,过了二级C语言的同学应该都能理解了。

然而。有例外,近期在微信群中看到大佬们提到了Clifford's Device,由于一个比较冷门的c语言技巧,趁此学习下。

2、主要参考资料

1、菜鸟教程:C 库函数 – strtol() | 菜鸟教程 (runoob.com)和strtol - C++ Reference (cplusplus.com)以及C++ Shell (cpp.sh)在线运行网站

2、Clifford's Homepage - Fun with Program Code。其主页:Claire Wolf (clifford.at),是一个大佬的主页,肯定是比较牛逼的,资料是英文的,不难看懂,看不懂可以谷歌翻译。

这位大佬在文章也提到过Duff's Device,这个是比较出名的,他自己想出来一个switch case的代码框架(暂且如此称呼)。经过gcc编译运行,语法没有错。

3、goto版本代码

goto是一个关键字,可以在函数内直接跳转到某个label处再执行,在某些场合是比较适合的,linux中也有用到(linus也是大神~)贴代码之前,上一个库函数的c语言例子先热热身。

C 库函数 - strtol()

包含于标准库 - <stdlib.h>

——描述

 long int strtol(const char *str, char **endptr, int base)

 把参数 str 所指向的字符串根据给定的 base 转换为一个长整数(类型为 long int 型),base 必须介于 2 和 36(包含)之间,或者是特殊值 0。

——声明

下面是 strtol() 函数的声明。

long int strtol(const char *str, char **endptr, int base)

——参数

str -- 要转换为长整数的字符串。

endptr -- 对类型为 char* 的对象的引用,其值由函数设置为 str 中数值后的下一个字符。

base -- 基数,必须介于 2 和 36(包含)之间,或者是特殊值 0。

——返回值

该函数返回转换后的长整数,如果没有执行有效的转换,则返回一个零值。

测试代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

/* strtol example */

#include <stdio.h>      /* printf */

#include <stdlib.h>     /* strtol */

 

int main ()

{

  char szNumbers[] = "2001 60c0c0 -1101110100110100100000 0x6fffff";

  char * pEnd;

  long int li1, li2, li3, li4;

  li1 = strtol (szNumbers,&pEnd,10);

  li2 = strtol (pEnd,&pEnd,16);

  li3 = strtol (pEnd,&pEnd,2);

  li4 = strtol (pEnd,NULL,0);

  

  • 12
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值