术语"运算符优先级"和"评估顺序"是编程中非常常用的术语,对于程序员来说非常重要.而且,据我所知,这两个概念紧密相连; 在谈论表达时,一个人离不开另一个人.
我们举一个简单的例子:
int a=1; // Line 1
a = a++ + ++a; // Line 2
printf("%d",a); // Line 3
Run Code Online (Sandbox Code Playgroud)
现在,很明显会Line 2
导致未定义的行为,因为C和C++中的序列点包括:
在评估&&(逻辑AND)的左右操作数之间,|| (逻辑OR)和逗号运算符.例如,在表达式中
*p++ != 0 && *q++ != 0
,子表达式的所有副作用*p++ != 0
都在任何访问尝试之前完成q
.在评估三元"问号"运算符的第一个操作数和第二个或第三个操作数之间.例如,在表达式中,在第
a = (*p++) ? (*p++) : 0
一个之后存在一个序列点*p++
,这意味着它已经在第二个实例执行时增加了.在完整表达结束时.此类别包括表达式语句(例如赋值
a=b;
),return语句,if,switch,while或do-while语句的控制表达式,以及for语句中的所有三个表达式.在函数调用中输入函数之前.未指定参数的计算顺序,但此序列点表示在输入函数之前所有副作用都已完成.在表达式中
f(i++) + g(j++) + h(k++)
,f
使用原始值的参数调用i
,但i
在进入正文之前递增f
.同样,j
和k
正在进入前更新g
和h
分别.然而,不指定以何种顺序f() …
我读了一本关于试探性定义的书,
暂定定义是没有存储类说明符且没有初始化程序的任何外部数据声明.如果到达翻译单元的末尾并且没有出现具有标识符的初始化器的定义,则暂定定义变为完整定义
请解释上述声明的含义.还有,声明和定义之间的区别?由于这个原因我混淆了.:(为什么这个程序没有错误:
#include <stdio.h>
int a; //Tentative definition
int a; //similarly this declaration too.
int main() //not getting any error with this code why its so?
{
printf("hi");
}
Run Code Online (Sandbox Code Playgroud)
此外,此代码有什么问题:
#include<stdio.h>
printf("Hi");
int main(void){
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我想跨多个c文件共享某些C字符串常量.常量跨越多行以便于阅读:
const char *QUERY = "SELECT a,b,c "
"FROM table...";
Run Code Online (Sandbox Code Playgroud)
上面的操作给出了QUERY的重新定义错误.我不想使用宏,因为每行后都需要退格'\'.我可以在单独的c文件中定义这些并在h文件中对变量进行extern但是我觉得这样做很懒.
有没有其他方法可以在C中实现这一目标?
曾经阅读过Book:C++ Primer,Third Edition作者:Stanley B. Lippman,JoséeLajoie
到目前为止发现1个错误....在根据第6.3条给出的程序中,一个向量如何生长,这个程序在couts中错过了一个"<"!给出的计划是:
#include <vector>
#include <iostream>
int main(){
vector< int > ivec;
cout < "ivec: size: " < ivec.size()
< " capacity: " < ivec.capacity() < endl;
for ( int ix = 0; ix < 24; ++ix ) {
ivec.push_back( ix );
cout < "ivec: size: " < ivec.size()
< " capacity: " < ivec.capacity() < endl;
}
}
Run Code Online (Sandbox Code Playgroud)
现在我纠正了这个问题.本书后面的内容如下:"在Rogue Wave实现中,ivec定义后的大小和容量均为0.然而,在插入第一个元素时,ivec的容量为256,其大小为1."
但是,在纠正和运行代码时,我得到以下输出:
ivec: size: 0 capacity: 0
ivec[0]=0 ivec: size: 1 capacity: 1
ivec[1]=1 ivec: size: …
Run Code Online (Sandbox Code Playgroud) 为什么这个编译:
int main()
{
{}
}
Run Code Online (Sandbox Code Playgroud)
但这不是:
{}
int main()
{
}
Run Code Online (Sandbox Code Playgroud) 在C++ Primer一书中,它有一个C风格字符数组的代码,并展示了如何=
在第15.3条Operator =中重载运算符.
String& String::operator=( const char *sobj )
{
// sobj is the null pointer,
if ( ! sobj ) {
_size = 0;
delete[] _string;
_string = 0;
}
else {
_size = strlen( sobj );
delete[] _string;
_string = new char[ _size + 1 ];
strcpy( _string, sobj );
}
return *this;
}
Run Code Online (Sandbox Code Playgroud)
现在我想知道为什么String &
在下面的代码执行相同的工作时需要返回引用,没有任何问题:
void String::operator=( const char *sobj )
{
// sobj is the null …
Run Code Online (Sandbox Code Playgroud) 为什么我运行这个程序时没有输出.
#include<stdio.h>
int main()
{
char* t="C++";
t[1]='p';
t[2]='p';
printf("%s",t);
return 0;
}
Run Code Online (Sandbox Code Playgroud) 对于以下代码片段,我得到输出为1
.我想知道它是怎么来的?
void main()
{
int x=10,y=20,z=5,i;
i=x<y<z;
printf("%d",i);
}
Run Code Online (Sandbox Code Playgroud) 我读了我的书:
抽象类是一个专门用作基类的类.抽象类包含至少一个纯虚函数.通过在类声明中的虚拟成员函数的声明中使用纯说明符(= 0)来声明纯虚函数.
抽象类是否必须具有虚函数?为什么?
纯虚函数和虚函数有什么区别,它们的需求是什么?