不常用C/C++,整理一些基础语法备忘。

编译器知识

一般在苹果机之外的电脑,printf() 从左往右扫描,从右往左计算。
在苹果机下,printf 从左往右扫描,从左往右计算。
这其实和编译器用的c库有关。一般大家为了方便,直接通过在mac下安装xcode,进而达到安装c库的目的。所以在使用printf()的时候最好避免进行计算。下面代码在mac运行下为 2 2 2 2,别的电脑下运行为: 2 2 3 2。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>

int main(){
int a = 2;
int *p = &a, *q = &a;

printf("%d %d\n", *p++, *(q++));

p = &a;
q = &a;

printf("%d %d\n", *p, (*q)++);
return 0;
}

类型转换

1. int to char

int a = 1; char b = a+'0';

2. char to int

C语言中每一个字符都是一个数字(ANSII码),int to char 只要减 ‘0’ 就好。char在技术实现上是整数类型,

char a = '1'; int b = a-'0';

待续。

函数

  • scanf()函数返回的值为:按指定格式正确地输入变量的个数。具有短路性质,即当第n个变量输入错误时,返回n-1,而不对之后的变量正确性做判断。出错时则返回EOF(-1)。

集合

set和multiset会根据特定的排序准则,自动将元素进行排序。不同的是后者允许元素重复而前者不允许。

获取UNIX时间戳

在Linux系统中,时间戳是一个绝对值,表示距离时间(1970-1-1, 00:00:00)的秒数。在C\C++ 语言中,用数据类型 time_t 表示时间戳,time_t 本质上是一个long int。

目前许多操作系统使用32位二进制数字表示时间。此类系统的Unix时间戳最多可以使用到格林威治时间2038年01月19日03时14分07秒(二进制:01111111 11111111 11111111 11111111)。其后一秒,二进制数字会变为10000000 00000000 00000000 00000000,发生溢出错误,造成系统将时间误解为1901年12月13日20时45分52秒。这很可能会引起软件故障,甚至是系统瘫痪。使用64位二进制数字表示时间的系统(最多可以使用到格林威治时间292,277,026,596年12月04日15时30分08秒)则基本不会遇到这类溢出问题。[2]

time(2) - Linux man page

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <time.h>
time_t time(time_t *t);

Description
time() returns the time as the number of seconds since the Epoch, 1970-01-01 00:00:00 +0000 (UTC).
If t is non-NULL, the return value is also stored in the memory pointed to by t.

Return Value
On success, the value of time in seconds since the Epoch is returned. On error, ((time_t) -1) is returned, and errno is set appropriately.

Errors

EFAULT
t points outside your accessible address space.

Conforming to
SVr4, 4.3BSD, C89, C99, POSIX.1-2001. POSIX does not specify any error conditions.

实现代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
#include<string>
#include<time.h>
#include <sstream>
using namespace std;

int main()
{
time_t now;
time(&now);
cout<<now<<endl;

//time_t转换为string类型
stringstream ss;
ss << now;
string curtime = ss.str(); //c++11 可以使用to_string(now)
cout<<v<<endl;
return 0;
}

参考