下面练习程序别忘记开头都加上这一语句
#include
using namespace std;
int main()
{
int a = 5 + 10 * 20 / 2;
cout << a << endl;
}
using namespace std;
int main()
{
string vec;
(*(vec.begin())); //(a)加括号
(*(vec.begin()) + 1); //(b)加括号
}
可以,因为这样会使得c++运行时候代码的效率更快,而编译者应该尽量避免产生程序的潜在缺陷
using namespace std;
int main()
{
int a = 12 / 3 * 4 + 5 * 15 + 24 % 4 / 2;
int b = ((12 / 3) * 4) + (5 * 15) + ((24 % 4) / 2);
cout << a << " " << b << endl;
}
using namespace std;
int main()
{
int a = -30 * 3 + 21 / 5; //-90 + 4 = -86
int b = -30 + 3 * 21 / 5; //-30 + 63/5 = -30 + 12 = -18
int c = 30 / 3 * 21 % 5; //10*21%5 = 210%5 = 0
int d = -30 / 3 * 21 % 4; //-10*21%4 = -210%4 = -2
cout << a << " " << b << " " << c << " " << d;
}
using namespace std;
int main()
{
int a;
cout << "请输入一个整数,我将判断是奇数还是偶数" << endl;
while (cin >> a) {
if (a % 2 == 0) {
cout << "偶数" << endl;
}
else {
cout << "奇数" << endl;
}
}
}
using namespace std;
int main()
{
int a = 2147483647; //2的31次方-1
a++;
cout << a << endl;
short b = 32767; //2的15次方-1
b++;
cout << b << endl;
}
逻辑与,先判断左边表达式是否为真,否输出false;若为真则判断右边表达式是否为真,真输出true,否输出false
逻辑或,先判断左边表达式是否为真,若为否则判断右边表达式是否为真,真输出true,否输出false;若为真直接输出true
相关性运算符先返回左边比较的结果,再将这个结果与右边表达式比较
using namespace std;
int main()
{
const char* cp = "Hello World";
if (cp && *cp); //先判断cp指针所指向的地址是否是空地址,是则输出false,不是则判断指针内的内容是否为0,是则输出false,否则输出true
}
using namespace std;
int main()
{
int i = 0;
while (cin >> i && i != 42);
}
using namespace std;
int main()
{
int a, b, c, d;
if (a > b && b > c && c > d);
}
首先判断i是否等于j,若等于,则判断k是否大于0,若不等于,则判断k是否大于1
using namespace std;
int main()
{
int i;
double d;
d = i = 3.5; //i赋值5后赋值到d上,首先i值为3赋予d后,d=3
i = d = 3.5; //d值为3.5,赋值到i上后,i=3
}
int main()
{
if (42 = i); //非法,42不能被赋值
if (i = 42); //i=42,i不等于0,true,则可以执行if语句
}
int main()
{
double dval;
int ival;
int* pi;
dval = ival = pi = 0; //错误“=”: 无法从“int *”转换为“int” 应该改为*pi
}
int main()
{
if (p = getptr() != 0); //应该在p后面再加一个=号
if (i = 1024); //在i后面加一个=号
}
前置运算符是对变量本身进行加,后置运算符将对象原始值的副本作为右值返回
第一次循环则解引用第二个地址;最后一次循环,则解引用vector最后一个地址的后一个位置
如果表达式不正确,为什么?应该如何修改?
#include
using namespace std;
int main()
{
int* ptr;
vector<int> vec;
int ival;
ptr != 0 && *ptr++; //判断ptr是否为0
ival++&& ival; //首先判断ival是不是为0,不是的话判断ival+1是不是为0,不是输出true,是则输出false
vec[ival++] <= vec[ival]; //等价玉vec[ival]<=vec[ival+1]
}
#include
#include
using namespace std;
int main()
{
vector<string>::iterator iter;
*iter++; //表示对iter解引用,并将iter指向下一个位置
(*iter)++; //错误,因为iter是字符串,所有不能进行++
*iter.empty();//点运算符优先级比解引用高,所以,对一个地址访问成员是错误的
iter->empty();//相当于(*iter).empty(),对string对象找成员对象是对的
++* iter; //字符串不能++
iter++->empty();//相当于(*iter).empty(),对string对象找成员对象是对的,然后再对iter进行++
}
#include
#include
using namespace std;
int main()
{
vector<int> a={1,2,3,4};
vector<int> b;
for (int i = 0; i < 4; i++) {
b.push_back((a[i] % 2 != 0) ? (2 * a[i]) : a[i]);
cout << b[i] << endl;
}
}
要求程序包含两个版本:一个版本只使用条件运算符;另一个版本使用1个或多个if语句。哪个版本的程序更容易理解呢?为什么?
#include
#include
using namespace std;
int main()
{
//版本一:只使用条件运算符
int socres;
cout << "请输入所得分数:" << endl;
cin >> socres;
string a = ((socres < 60) ? "fail" : (socres <= 75) ? "loe pass" : (socres <= 90) ? "pass" : "high pass");
cout << a << endl;
//版本二:使用1个或多个if语句
cout << "请输入所得分数:" << endl;
cin >> socres;
if (socres < 60) {
cout << "fail" << endl;
}
else if (socres <= 75) {
cout << "low pass" << endl;
}
else if (socres < 90) {
cout << "pass" << endl;
}
else {
cout << "high pass" << endl;
}
}
#include
#include
using namespace std;
int main()
{
string s = "word";
//string p1 = s + s[s.size() - 1] == 's' ? "" : "s"; //原意是想判断s[s.size()-1]是不是等于s,要是是输出"",要是不是,输出s
string p1 = s + ((s[s.size() - 1] == 's') ? "" : "s"); //修改后
}
假如条件运算符满足的是左结合律,求值过程将会是怎么样的?
那就比如string a = ((socres < 60) ? “fail” :(socres <= 75) ? “loe pass” : (socres <= 90) ? “pass” : “high pass”);
改成string a = ((socres >90) ? “fail” : (socres >75) ? “loe pass” :(socres >60) ? “pass” : “high pass”);
对于符号位如何处理没有明确的规定,所以强烈建议仅将位运算符用于处理无符号类型
首先对q取反则是10001110,再向左移6位,则为10000000,是2的7次方=128
超过16位的同学,就算通过了测验也是0,会出现位数不够的情况
#include
#include
using namespace std;
int main()
{
unsigned long u11 = 3, u12 = 7;
int a = u11 & u12; //00000011和00000111位与操作,得到00000011,故a=3
int b = u11 | u12; //00000011和00000111位或操作,得到00000111,故b=7
int c = u11 && u12; //执行与判断,由于两个都不等于0,故c=1
int d = u11 || u12; //执行或判断,由于两个都不等于0,故d=1
cout << a << " " << b << " " << c << " " << d << endl;
}
sizeof的返回值是一个常量表达式,所以我们可以用sizeof的结果声明数组的维度
using namespace std;
int main()
{
cout << "void: nullptr_t" << sizeof(std::nullptr_t) << " bytes" << endl;
cout << "bool:" << sizeof(bool) << " bytes" << endl;
cout << "char:" << sizeof(char) << " bytes" << endl;
cout << "wchar_t:" << sizeof(wchar_t) << " bytes" << endl;
cout << "char16_t:" << sizeof(char16_t) << " bytes" << endl;
cout << "char32_t:" << sizeof(char32_t) << " bytes" << endl;
cout << "short:" << sizeof(short) << " bytes" << endl;
cout << "int:" << sizeof(int) << " bytes" << endl;
cout << "long:" << sizeof(long) << " bytes" << endl;
cout << "long long:" << sizeof(long long) << " bytes" << endl;
cout << "float:" << sizeof(float) << " bytes" << endl;
cout << "double:" << sizeof(double) << " bytes" << endl;
cout << "long double:" << sizeof(long double) << " bytes" << endl;
cout << "int8_t:" << sizeof(int8_t) << " bytes" << endl;
cout << "uint8_t:" << sizeof(uint8_t) << " bytes" << endl;
cout << "int16_t:" << sizeof(int16_t) << " bytes" << endl;
cout << "uint16_t:" << sizeof(uint16_t) << " bytes" << endl;
cout << "int32_t:" << sizeof(int32_t) << " bytes" << endl;
cout << "uint32_t:" << sizeof(uint32_t) << " bytes" << endl;
cout << "int64_t:" << sizeof(int64_t) << " bytes" << endl;
cout << "uint64_t:" << sizeof(uint64_t) << " bytes" << endl;
}
#include
using namespace std;
int main()
{
int x[10];
int* p = x;
cout << sizeof(x) / sizeof(*x) << endl; //sizeof(x)=10,sizeof(*x)=1头指针所在
cout << sizeof(p) / sizeof(*p) << endl; //sizeof(p)=2因为地址是int型占2个字节,sizeof(*p)=1头指针所在
}
#include
using namespace std;
int main()
{
(sizeof x) + y;
sizeof(p->men[i]);
(sizeof a) < b;
sizeof(f());
}
后置版本需要将之前还没进行修改的值保存下来,以便返回,如果不需要未修改的值就使用前置版本。使用后置版本无需改动。
#include
#include
using namespace std;
int main()
{
vector<int> ivec = { 1,2,3,4 };
vector<int>::size_type cnt = ivec.size();
for (vector<int>::size_type ix = 0; ix != ivec.size(); ix++, cnt--) {
ivec[ix] = cnt;
cout << ivec[ix] << endl;
}
}
#include
#include
using namespace std;
int main()
{
constexpr int size = 5; //定义一个常量表达式
int ia[size] = { 1,2,3,4,5 }; //初始化一个含量为5数组
for (int* ptr = ia, ix = 0; ix != size && ptr != ia + size; ++ix, ++ptr) { //ptr指向ia的首地址,当ix不等于5且ptr所指向地址没到尾部则循环
}
}
someValue ? ++x,++y : --x,–y; 当someValue不等于0时候,x和y各自加一,等于0时候,x和y各自减一
需要注意每种运算符遵循的是左结合律还是右结合律
#include
#include
using namespace std;
int main()
{
float fval;
double dval;
int ival;
char cval;
if (fval); //fval将会转换成bool型
dval = fval + ival; //fval+ival所得结果是float型,赋值给dval后变成了double型
dval + ival * cval; //cval变成int型,最终结果变成double型
}
请问下面的表达式中发生了隐式类型转换吗?如果有,请指出来
#include
#include
using namespace std;
int main()
{
char cval;
int ival = 1;
unsigned int ui = 2;
float fval = 1.1;
double dval;
cval = 'a' + 3; //'a'转换成int型和3相加,之后再转换为char型变成'd'
cout << cval << endl;
fval = ui - ival * 1.0; //ival变成double型,之后再变成unsigned无符号型,最后变成浮点型
cout << fval << endl;
dval = ui * fval; //fval转换成无符号型int,之后相乘结果转换为double型
cout << dval << endl;
cval = ival + fval + dval; //ival转换成了float型与fval相加,之后相加结果变成double型和dval相加最后变成char型
cout << cval << endl;
}
注意:虽然有时候不得不使用强制类型转换,但这种方法本质上是非常危险的
cast-name(expression)
cast-name有static_cast、const_cast(改变表达式的常量属性)、reinterpret_cast(指针对指针使用这个)、dynamic_cast
旧式的强制类型转换
type(expr); 函数形式的强制类型转换
(typr)expr; c语言风格的强制类型转换
#include
#include
using namespace std;
int main()
{
int i = 10;
double d = 5.5;
i *= static_cast<int>(d);
}
#include
#include
using namespace std;
int main()
{
int i;
double d;
const string* ps;
char* pc;
void* pv;
pv = (void*)ps;
pv = static_cast<void*>(const_cast<string*>(ps)); //新式
i = int(*pc);
i = static_cast<int>(*pc); //新式
pv = &d;
pv = static_cast<void*>(&d); //新式
pc = (char*)pv;
pc = reinterpret_cast<char*>(pv); //新式,指针对指针使用这个
}
#include
#include
using namespace std;
int main()
{
double slope = static_cast<double>(j / i); //将j除以i的结果转换为double型,赋值给slope
}