据说无限循环for(;;);
是未定义的行为.
来自http://en.cppreference.com/w/cpp/language/memory_model
在有效的C++程序中,每个线程最终都会执行以下操作之一:
- 终止
- 调用I/O库函数
- 读取或修改易失性对象
- 执行原子操作或同步操作
没有执行任何这些可观察的行为,任何执行线程都不能永远执行.
请注意,这意味着具有无限递归或无限循环的程序(无论是作为for语句实现还是通过循环goto或其他方式)具有未定义的行为.
但是如果它在共享库中调用函数呢?
for(;;) sofunc();
该函数可以执行任何类型的阻塞I/O或抛出异常.
在这种情况下,编译器是否假定循环具有一些可观察的行为?
我喜欢这个很棒的功能.但我可以用gcc
或clang
(或任何工具)做同样的事情吗?
-E
选项使所有宏完全展开.所以我没有找到任何替代方法来逐步扩展宏.
Eclipse很大.我希望我不需要在任何地方安装它并一直启动它.
我知道人们总是说不要使用longjmp
,它是邪恶的,它是危险的。
但我认为它对于退出深度递归/嵌套函数调用很有用。
是不是一次下单longjmp
比多次重复检查和退货要快一些if(returnVal != SUCCESS) return returnVal;
?
至于安全性,只要动态内存等资源释放得当,应该不会有问题吧?
到目前为止,使用似乎longjmp
并不困难,甚至使我的代码更简洁。我很想经常使用它。
(恕我直言,在许多情况下,首先在深度递归中没有分配动态内存/资源。深度函数调用对于数据解析/操作/验证来说似乎更常见。动态分配通常发生在更高级别,然后调用函数,其中setjmp
出现。)
当我使用C++时,这行编译,但不是C:
gmtime(&(*(time_t *)alloca(sizeof(time_t)) = time(NULL))); //make an lvalue with alloca
我对这种差异感到惊讶.甚至没有C++的警告.
当我指定时gcc -x c
,消息是:
playground.cpp:25:8: error: lvalue required as unary '&' operand
gmtime(&(*(time_t *)alloca(sizeof(time_t)) = time(NULL)));
^
Run Code Online (Sandbox Code Playgroud)
这不是&
一个地址的运营商吗?为什么它在C和C++中有所不同?
虽然我可以在C中使用复合文字,但仍然可以修改我的语法以使其在C&C++中都有效吗?
func sub(){
defer func (){
panic(2)
}()
panic(1)
}
func main(){
defer func(){
x:=recover()
println(x.(int));
}()
sub()
}
Run Code Online (Sandbox Code Playgroud)
我尝试了这个代码,似乎第一次恐慌panic(1)
被第二次恐慌简单地"覆盖"了panic(2)
.
但这样做可以吗?或者调用可能在延迟函数内发生恐慌的Golang函数?
(在C++中,从析构函数中抛出异常几乎是不可接受的.如果堆栈已经展开,它会终止程序.我不知道在Golang中是否会以类似的方式恐慌.)
我尝试编写一些jshell脚本.抛出异常时,jshell仍继续执行下一行.
如何让我的脚本更像普通的java程序?
编辑:我只是像运行它一样jshell SCR.jsh
.
使用throw new Exception()
或1/0
不阻止执行下一行.
该脚本包含如下语句:
System.out.println(1/0)
System.out.println("foo")
/exit
Run Code Online (Sandbox Code Playgroud)
我以为第二行无法访问.这就是我的预期.但在打印异常后,foo
也会打印出来.
在C11(n1570)中,有一些运算符的结果类型已明确说明.例如,&&的结果具有int类型.但我还没有找到其他运算符的结果类型,比如+.它是在标准的某个地方指定的吗?
我试过这个程序:
unsigned char usc = 254;
unsigned int usi = 4294967293;
signed char sic = 126;
long long unsigned llu = usc*2;
printf("%llu\n",llu);
llu = usi*2;
printf("%llu\n",llu);
llu = usc+usc;
printf("%llu\n",llu);
llu = usi+usi;
printf("%llu\n",llu);
llu = usc+4294967294;
printf("%llu\n",llu);
llu = usc+2147483646;
printf("%llu\n",llu);
llu = sic+4294967294;
printf("%llu\n",llu);
llu = sic+2147483646;
printf("%llu\n",llu);
Run Code Online (Sandbox Code Playgroud)
输出:
508
4294967290
508
4294967290
4294967548
18446744071562068220
4294967420
18446744071562068092
Run Code Online (Sandbox Code Playgroud)
我想unsigned char在这里被提升,但是unsigned int没有; char + unsigned int的结果类型似乎是unsigned int,char + int的结果类型似乎是int.
但我不太确定.
这些铸件是标准的还是实施定义的?