switch 内部变量定义
不允许跨过变量的初始化语句直接跳转到该变量作用域内另外一个位置。
int cnt = 1;
switch (cnt) {
case 0:
int j;
break;
case 1:
j = 3;
break;
}
// OK
int cnt = 1;
switch (cnt) {
case 0:
int j = 0;
break;
case 1:
j = 3;
break;
}
//crosses initialization of 'int j'
int cnt = 1;
switch (cnt) {
case 0:
string fileName;
break;
case 1:
cout << fileName << endl;
break;
}
// ?
- goto 语句
goto end;
int cnt = 1;
end :
cnt = 10;
//crosses initialization of 'int cnt'
begin :
int cnt = 200 - rand();
if (cnt > 0) {
goto begin;
}
cout << cnt << endl;
// OK
初始化
如果内置类型未被显示初始化,则它的值由定义的位置决定:
-
定义于任何函数之外的变量被初始化为0
-
定义在函数体内部的内置类型将不被初始化,不被初始化的内置类型变量的值是未定义的
int g_i; int main() { int i; int cnt = 1; cout << "g_i = " << g_i << endl; cout << "i = " << i << endl; return 0; } //g_i = 0 //i = 16
-
各个类各自决定其初始化对象的方式
声明vs定义
extern double pi = 3.141592654; //定义
逻辑表达式
-
运算优先级
- 逻辑OR、逻辑AND的优先级低于关系运算符
- 逻辑AND的优先级高于逻辑OR
- !运算符的优先级高于所有的关系运算符、算术运算符
-
顺序点
变量修改的最晚实现时刻。
这个点上,之前所有的赋值所产生的副作用都已发生完成,并且在其后的赋值不能在该点产生任何副作用。在顺序点之间则没有任何保证。(运算符左边的子表达式先于右边的子表达式)
- 分号;
- 未重载的逗号运算符的左操作数赋值之后(即“,”处)
- 未重载的”||”运算符的左操作数赋值之后(即“||”处)
- 未重载的“&&”运算符的左操作数赋值之后(即"&&"处)
- 三元运算符“? : ”的左操作数赋值之后(即“?”处)
- 在函数所有参数赋值之后但在函数第一条语句执行之前
- 在函数返回值已拷贝给调用者之后但在该函数之外的代码执行之前
- 每个基类和成员初始化之后
在标准中规定:在两个顺序点之间,一个数值对象最多只能由表达式赋值修改一次。而对于其他的行为不给予明确定义。
int i = 3; int k=(++i)+(++i)+(++i);//各个编译器处理方法不同, gcc:16, 18(vc)
-
逻辑运算符的另一种表示
and、or、not:C++中的保留字;不是C语言的保留字(include头文件iso646.h,可将它们用作运算符)
运算符 另一种表示 && and
| || | or |
| ! | not |
参考: C/C++顺序点
字符函数库cctype
include <cctype>
函数名 | 返回值 |
---|---|
isalnum() | 如果参数是字母or数字,返回true |
isalpha() | 如果参数是字母,返回true |
iscntrl() | 如果参数是控制字符,返回true |
isdigit() | 如果参数是数字(0-9),返回true |
isgraph() | 如果参数是除空格之外的打印字符,返回true |
islower() | 如果参数是小写字母,返回true |
isprint() | 如果参数是打印字符(包括空格),返回true |
ispunct() | 如果参数是标点符号,返回true |
isspace() | 如果参数是标准空白字符,返回true |
isupper() | 如果参数是大写字母,返回true |
isxdigit() | 如果参数是十六进制数,即0-9、a-f、A-F,返回true |
tolower() | 如果参数是大写字符,则返回其小写,否则返回该参数 |
toupper() | 如果参数是小写字符,则返回其大写,否则返回该参数 |
网友评论