整理平时遇到的菜鸟级c/c++症状(补充...)

来源:互联网 发布:php fpm 编辑:程序博客网 时间:2024/05/01 08:48

btw:by the way

IMHO:in my humble opinion

纯c语言的语法与c++中兼容的c还是有少量的区别的。或者说c++的某些语法实现了c语言不具有的特性,或者来自于c99新规范。

<1>数组大小的定义和变长数组(未解决)

c89中必须使用宏定义的常量,或者是常量表达式

c++/c89中要求数组的大小必须是整数常量表达式

通过define定义的常量,与const定义的常量的区别:define定义的并不是一个变量,而是一个Compile-Time概念,编译时只做相应的文本替换,而不会为其分配存储空间,没有具体的数据类型。const定义的变量,会在堆栈中分配空间,是一个Run-Time概念,能够通过变量操作(比如取地址操作),编译器会对其进行类型检查。const常量存在于程序的数据段,#define常量存在于程序的代码段。#define 定义的一般常数应用,run-time角度时间和空间上都有优势,compile-time角度会有常量折叠优化,而const常量要在run-time执行。

gcc如果要支持c99语法需要先开启c99 mode,或者gcc -std=c99 main.c -o main

<2>.c-style-string与c++ string类型的差异

比较(==,>=等比较运算符):

赋值/构造:


<3>c语言中指针数组如何分配空间或者如何使用

形如char *s[s_size]

<4>空字符,空格字符

空字符(NULL character),ASCII码为ox0,通常作为c-style-string的结束字符。

空格符,ASCII码为ox20

<5>scanf的使用,以及数组字符串和指针字符串在用scanf输入时的区别。

scanf的"%[..]"使用

%[…]如果输入的字符属于方括号内字 符串中某个字符,那么就提取该字符;如果一经发现不属于就结束提取。%[^…]如果一经发现输入的字符属于方括号内字符串中某个字符,那么就结束提取;如果不属于就提取该字符。这两种方法会自动加上一个字符串结束符到已经提取的字符后面。如使用这种方法,可以使用scanf输入含有空格的字符串。默认情况下,scanf忽略前导的空白字符,并且在遇到空格或换行时停止。

char *pstr = (char *) malloc(pstr_size * sizeof(char));char  str[str_size];scanf("%[^\n]",str);//输入含有空格的字符串//scanf("%[^\n]",&str);//这里有对字符串名取地址,仍然可行scanf("%s",pstr);//scanf("%s",&pstr);//这样就不可行

我的理解是:这就会牵涉到数组与指针的微妙的不同,并不是任何时候数组就会被解析成指针的,scanf函数的的参数有两部分构成,前一部分是parameter format来标注输入值的类型,后一部分是一组保存输入值的指针,它们指向为待保存objects的内存空间。
对数组&运算,得到的是一个指向数组类型的指针,&str 得到的仍然是str。而且我们知道,数组的首地址是一个地址常量。
而对指针&运算得到的是一个二级指针,我么是不能对一个二级指针赋值多个元素的。
比如:
char *argv[] = {"hello","world!"};char **argv = {"hello","world!"};//这样是不正确的scanf("%[^n]",a);getchar();前一句表示读入字符读直到读到字符\n结束,如下:scanf("%[^\n]",a);getchar();//scanf()把所有字符全提取,\n就给getchar();
<6> 算术表达式求值过程中,中间结果如何保存。会不会有类型转换的可能?
long long ans;//long long  n;int n;//如果n很大ans超过了int可表示的范围,ans输出会为负数ans = (n * n - n + 6) * ( n + 1) / 6;//cout<<ans<<endl;printf("%lld\n",ans);
我猜测:一定是在处理中使用n的类型保存计算的中间结果,导致溢出。


原创粉丝点击