C语言不容易识别的坑
1、重复两次定义
#include<stdio.h>
#include<stdlib.h>
#include<string.h> int a,b;
void fun()
{
a=;
b=;
printf("%d,%d\n",&a,&b);
}
int main()
{
int a=,b=;
fun();
printf("%d,%d\n",a,b);
printf("%d,%d\n",&a,&b);
return ;
}

从运行结果中可以看出,如果全局变量定义一次a,b, main函数中定义一次a,b两个地址是不一样的。
改成下面结果就对
#include<stdio.h>
#include<stdlib.h>
#include<string.h> int a,b;
void fun()
{
a=;
b=;
printf("%d,%d\n",&a,&b);
}
int main()
{
/*int*/ a=,b=;
fun();
printf("%d,%d\n",a,b);
printf("%d,%d\n",&a,&b);
return ;
}

2、强制转换优先级
#include<stdio.h>
#include<stdlib.h>
#include<string.h> int main()
{
double a,b;
a = 5.5;
b = 2.5;
printf("%f\n",(int)a+b/b); //先强制转换为 int a ,在+double型的b/b
printf("%d",(int) (a+b/b));
return ;
}

3、等号的左边只能是变量,不可以是表达式
#include <stdio.h>
#include <stdlib.h> int main()
{
int k,a,b=;
unsigned long w=;
k=b+=w; //错误语句
return ;
}
4、逗号运算符的使用(必须在赋值运算符前加括号)
#include <stdio.h>
#include <stdlib.h> int main()
{
int a=, b=,c=;
c = ( a-=a-),(a=b,b+); //赋值运算符的优先级比逗号运算符高,先把5赋值给c;
printf("%d %d %d\n",a,b,c); c = ( ( a-=a-),(a=b,b+) ); //逗号运算符,把最右边的值赋值给c
printf("%d %d %d",a,b,c);
return ;
}

5、#define 预定义的用法
#include <stdio.h>
#include <stdlib.h> #define S(x) 4*(x)*x+1
int main()
{
int k=,j=;
printf("%d",S(k+j)); // 4*(5+2)*5+2+1 =143 注意define没有括号坚决不加括号,直接写
return ;
}
6、&&符号左边不成立不再执行右边, ||左边成立不再执行右边
#include <stdio.h>
#include <stdlib.h> int main()
{
int i=,j=,k=;
if( (j++||k++) && i++) //k++将不会被执行
printf("%d %d %d\n",i,j,k); //2 2 2
return ;
}
7、scanf中出现*表示跳过指定宽度
#include <stdio.h>
#include <stdlib.h> int main()
{
int a,b;
double c;
scanf("%2d%*2d%2d%2lf",&a,&b,&c); //跳过第3,4个字符
printf("%d %d %f",a,b,c);
return ;
}

8、字符串长度,遇到转义字符
#include <stdio.h>
#include <stdlib.h>
#include<string.h>
int main()
{
char s1[] = "\\141\141abc\t";
printf("\\141\141abc\t :%d\n",strlen(s1));
/*
\\ 是一个字符,前一个表示转义
141 三个字符
\141 1个字符,注意这里是八进制符,如果超过8那就不是按三个算了
abc 三个字符
\t 一个字符
再加上结束符'\0'
共10个字符
而strlen(s)的值为9
*/
char s2[] = "\\141\1111abc\t";
char s3[] = "\\141\128abc\t";
char s4[] = "\\141\888abc\t";
printf("\\141\1111abc\t :%d\n",strlen(s2));
printf("\\141\89abc\t :%d\n",strlen(s3));
printf("\\141\888abc\t :%d\n",strlen(s4));
return ;
}
从这里也可以看出 \141代表的是字符a,\111代表的是字符I,而超过8的就直接输出了
9、自增自减运算符
#include <stdio.h>
#include <stdlib.h>
#include<string.h> int main()
{
int i=,s=;
do{
s+= i++; //这里是s为 4 7 11 17而不是5 9 15
if( s%==) continue;
else ++i;
printf("i=%d s=%d\n",i,s);
}while( s<);
return ;
}
C语言不容易识别的坑的更多相关文章
- [R语言]R语言计算unix timestamp的坑
R+mongo的组合真是各种坑等着踩 由于mongo中的时间戳普遍使用的是unix timestamp的格式,因此需要对每天的数据进行计算的时候,很容易就想到对timestamp + gap对方式来实 ...
- Python locale 多语言模块和我遇到的坑
Table of Contents 1. locale遇到的问题 1.1. locale 简介 1.1.1. 什么是locale 1.1.2. locale 相关命令 1.2. Python loca ...
- Spring Boot Security 国际化 多语言 i18n 趟过巨坑
网上很多的spring boot国际化的文章都是正常情况下的使用方法 如果你像我一样用了Spring Security 那么在多语言的时候可能就会遇到一个深渊 Spring Security里面的异常 ...
- C语言read函数的那些坑
今天在复习UNIX文件系统,用到那个read函数,但是无意中却掉到一个坑里了,用了一个多小时才找到问题根源,这里记录一下. 问题是这样的:我需要使用read和write函数把键盘输入的信息复制到输出. ...
- Python语言基础01-初识Python
本文收录在Python从入门到精通系列文章系列 1. Python简介 1.1 Python的历史 Python的创始人为吉多·范罗苏姆(荷兰语:Guido van Rossum) 1989年的圣诞节 ...
- C语言那年踩过的坑--局部变量,静态变量,全局变量在内存中存放的位置
先看几个概念: 1.bss是英文block started by symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0.bss段属于静态内存分配.它的初始 ...
- Android 应用内多语言切换
最近公司的 App 里需要用到多语言切换,简单来说,就是如果用户没有选择语言选项时,App 默认跟随系统语言,如果用户在 App 内进行了语言设置,那么就使用用户设置的语言.当然,你会发现,App 的 ...
- C++的坑真的多吗?
先说明一下,我不希望本文变成语言争论贴.希望下面的文章能让我们客观理性地了解C++这个语言.(另,我觉得技术争论不要停留在非黑即白的二元价值观上,这样争论无非就是比谁的嗓门大,比哪一方的观点强,毫无价 ...
- 【转】R语言知识体系概览
摘要:R语言的知识体系并非语法这么简单,如果都不了R的全貌,何谈学好R语言呢.本文将展示介绍R语言的知识体系结构,并告诉读者如何才能高效地学习R语言. 最近遇到很多的程序员都想转行到数据分析,于是就开 ...
随机推荐
- 数据结构之splay树
https://www.bilibili.com/video/av19879546 https://blog.csdn.net/u014634338/article/details/42465089 ...
- 人工智能-深度学习(2)TensorFlow安装及基本使用(学习笔记)
一.TensorFlow 简介 TensorFlow 是 Google 开源的一款人工智能学习系统.为什么叫这个名字呢? Tensor 的意思是张量,代表 N 维数组:Flow 的意思是流,代表基于数 ...
- stack(数组模拟) POJ 2559 Largest Rectangle in a Histogram
题目传送门 /* 题意:宽度为1,高度不等,求最大矩形面积 stack(数组模拟):对于每个a[i]有L[i],R[i]坐标位置 表示a[L[i]] < a[i] < a[R[i]] 的极 ...
- DotNteBar 控件操作
DotNteBar中ComboBoxEx.DroppedDown = true可以不点击该控件就显示其内容.将DropDownStyle属性设为DropDownList下拉框就不能进行编辑只能选择下拉 ...
- python版本2和3使用range()函数方法
python 2:可以直接使用range(5) 输入的列表结果和预期的一样 python 3:使用range(5) 得到列表结果却是这个,和预期的不一致,其原因是节省空间,防止过大的列表产生 如果想要 ...
- webform 基础一
WebForm是微软开发的一款产品,它将用户的请求和响应都封装为控件.让开发者认为自己是在操作一个windows界面.极大地提高了开发效率.区别于dreamweaver,可以用代码写,也可以把控件像w ...
- NBA15-16赛季半程有感
2015-2016 新赛季NBA已经开打半程又多了,这半个赛季我们见证了 勇士的三节打卡:骑士的磨合反复:马刺的老骥伏枥: 当然还有窝火的XJBD. 豪哥200W刀签约黄蜂,打出来800W刀的身价,无 ...
- AJPFX实列判断一个字符串是不是对称字符串
import java.util.Scanner; /** * 判断一个字符串是否是对称字符串 */ public class StringDemo { public static vo ...
- contact用法解析
经典用法: mysql> select concat('11','22','33'); +------------------------+ | concat('11','22','33') | ...
- redis-cli 工具--raw参数的作用
最近阅读了以redis官网关于--raw参数的解释,其功能有两个: 1.按数据原有格式打印数据,不展示额外的类型信息 例如:使用命令发送方式(redis在使用时有命令发送方式和交互方式两种)创建一个k ...