考虑以下程序:
#include <iostream>
int main()
{
std::cout<<"Can this lead to undefined behavior?"<<'\s';
}
Run Code Online (Sandbox Code Playgroud)
g++ 给出警告:
[Warning] unknown escape sequence: '\s' [enabled by default]
Run Code Online (Sandbox Code Playgroud)
这里'\s'不小心输入了,而不是'\n'。那么,这个程序是明确定义的还是未定义的?C++ 标准对此有何规定?K&R 的 C 编程语言说这是 C 中未定义的行为。
考虑以下示例:
#include <iostream>
#include <typeinfo>
int main()
{
int a=9;
std::cout << typeid(a).name() << '\n';
}
Run Code Online (Sandbox Code Playgroud)
g ++ 4.8.1上的输出:i
MSVS 2010上的输出:int
为什么输出是编译器依赖?这背后的原因是什么?为什么它被保留为实现定义?为什么在所有编译器上没有相同的输出?C++标准是否明确地说明了这一点?
考虑以下程序(请参阅此处的实时演示)
#include <iostream>
int main()
{
enum days{}d;
std::cout<<sizeof(d);
}
Run Code Online (Sandbox Code Playgroud)
在使用g ++ 4.8.1进行编译时,它在本地计算机上打印4作为输出.它如何在这里占用4个字节?在给定链接中的gcc 6.0上,我也使用了`-pedantic-option,但它编译得很好.
那么为什么它不允许在C?我在gcc 4.8.1中尝试了以下程序.(在这里查看现场演示)
#include <stdio.h>
int main(void)
{
enum days{}d;
printf("sizeof enum is %u",sizeof(d));
}
Run Code Online (Sandbox Code Playgroud)
编译器给出以下错误:
4 12 [Error] expected identifier before '}' token
5 36 [Error] 'd' undeclared (first use in this function)
5 36 [Note] each undeclared identifier is reported only once for each function it appears in
Run Code Online (Sandbox Code Playgroud)
是否允许在C++中使用空枚举但在C中不允许使用空枚举?
考虑以下计划:
#include <iostream>
#define add(s,m,a) ( s + m + a + 0 )
int main()
{
std::cout<<add(3,4,5)<<'\n';
std::cout<<add(15,30,)<<'\n';
std::cout<<add(10, , 33)<<'\n';
std::cout<<add(10,,)<<'\n';
std::cout<<add(,,)<<'\n';
}
Run Code Online (Sandbox Code Playgroud)
我的编译器gcc 4.8.1给出以下警告:
6 23 [Warning] invoking macro add argument 3: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]
7 25 [Warning] invoking macro add argument 2: empty macro arguments are undefined in ISO C90 and ISO C++98 [enabled by default]
8 21 [Warning] invoking macro add argument 2: empty …Run Code Online (Sandbox Code Playgroud) 我知道C&C++都是不同的语言,今天我在下面的程序中做了一点点错误,但程序在各种C++编译器上编译得很好(g ++,clang,MSVC++)
考虑以下计划:
int main()
{
int s[]={3,6,9,12,18};
int* p=+s; // Observe this strange looking initialization due to use of unary + operator
}
Run Code Online (Sandbox Code Playgroud)
上述程序在编译C++罚款(见现场演示这里),但不是在C(见现场演示这里).我的编译器(gcc 4.8.1)给出了当我编译它作为一个C程序我下面的错误.
[Error] wrong type argument to unary plus
Run Code Online (Sandbox Code Playgroud)
一元加运算符在这里服务的目的是什么?它到底在做什么?为什么C不允许?
#include <iostream>
int foo() {
std::cout<<"foo() is called\n";
return 9;
}
int bar() {
std::cout<<"bar() is called\n";
return 18;
}
int main() {
std::cout<<foo()<<' '<<bar()<<' '<<'\n';
}
// Above program's behaviour is unspecified
// clang++ evaluates function arguments from left to right: http://melpon.org/wandbox/permlink/STnvMm1YVrrSRSsB
// g++ & MSVC++ evaluates function arguments from right to left
// so either foo() or bar() can be called first depending upon compiler.
Run Code Online (Sandbox Code Playgroud)
上述程序的输出取决于编译器.未指定评估函数参数的顺序.我读到这个的原因是它可以导致高度优化的代码.如何不指定函数参数的精确评估顺序有助于编译器生成优化代码?
AFAIK,评估顺序严格按Java,C#,D等语言规定.
c++ optimization operator-precedence compiler-optimization unspecified-behavior
我试图从用户输入两个字符t.这是我的代码:
int main()
{
int t;
scanf("%d",&t);
char a,b;
for(i=0; i<t; i++)
{
printf("enter a: ");
scanf("%c",&a);
printf("enter b:");
scanf("%c",&b);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
奇怪的是,第一次输出是:
enter a:
enter b:
Run Code Online (Sandbox Code Playgroud)
也就是说,代码不等待值a.
我正在使用orwell dev c ++ IDE.我知道在旧的C89标准和预标准中,当函数定义中没有明确指定函数的返回类型时,C++支持缺省为int规则.但它已在C++中被禁止.但最近我写了以下简单的C程序,它工作正常.
#include <stdio.h>
void fun();
int main(void)
{
int a=9;
printf("%d",a);
printf("%d",a);
fun();
return 0;
}
a=1;
void fun()
{
printf("%d",a);
}
Run Code Online (Sandbox Code Playgroud)
默认的int规则是否也适用于变量?我的编译器向我显示以下警告.
[Warning] data definition has no type or storage class [enabled by default]
[Warning] type defaults to 'int' in declaration of 'a' [enabled by default]
Run Code Online (Sandbox Code Playgroud)
为什么C99标准仍允许默认为int?它在C++中编译失败.如果我错了,请纠正我?此C程序也适用于ideone.com等在线编译器
C++标准第3.7.3.1节说明了这一点
"未指定连续调用分配函数分配的存储的顺序,连续性和初始值."
订单和邻接是什么意思?为什么没有说明?为什么初始值也未指定?
为什么以下程序在编译时失败.
#include <iostream>
using namespace std;
class Test
{
public:
void fun()
{
cout<<"fun() in Test\n";
}
};
int main() {
new Test()->fun();
// your code goes here
return 0;
}
Run Code Online (Sandbox Code Playgroud)
访问此链接:http://ideone.com/qtCufW
允许在Java和C#中使用匿名对象调用成员方法,但为什么不允许在C++中使用?请帮我.