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语言. 最近遇到很多的程序员都想转行到数据分析,于是就开 ...
随机推荐
- 水题 Codeforces Round #307 (Div. 2) A. GukiZ and Contest
题目传送门 /* 水题:开个结构体,rk记录排名,相同的值有相同的排名 */ #include <cstdio> #include <cstring> #include < ...
- ACM_绝对值
100块钱都不给我 Time Limit: 2000/1000ms (Java/Others) Problem Description: 今天是广财的ACM周赛,小光来到广财实验楼,想来蹭一下素拓分( ...
- LinkedList,SortedList 基本用法
LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用. LinkedList<int> ma = new LinkedList<int>(); ...
- 对char类型的数组进行冒泡排序
package maopaopaixu; import java.util.Arrays; import java.util.Scanner; public class Demo02 { public ...
- 转】R利剑NoSQL系列文章 之 Hive
原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/3/ 感谢! Posted: Jul 27, 2013 Ta ...
- Android开发学习——游戏开发小demo
public class MainActivity extends Activity { private GameUI gameUI; @Override protected void onCreat ...
- [BZOJ1088][SCOI2005]扫雷Mine DP
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1088 记录下每一个格子对应左边格子放的雷的情况,然后dp转移就好了. #include&l ...
- Rxlifecycle使用详解,解决RxJava内存泄露问题
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/1122/3711.html
- pandas之groupby分组与pivot_table透视表
zhuanzi: https://blog.csdn.net/qq_33689414/article/details/78973267 pandas之groupby分组与pivot_table透视表 ...
- 短视频SDK超级简单易用
超级简单易用的短视频SDK来自RDSDK.COM.锐动天地为开发者提供短视频编辑.视频直播.特效.录屏.编解码.视频转换,等多种解决方案,涵盖PC.iOS.Android多平台.以市场为导向,不断打磨 ...